hdu 2597(容斥原理)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5297;

题意:给出n和r,求数列Y的第n个元素是多少。其中数列Y是正整数数列去除a^b(2<=b<=r)后的数

分析:

我的天啊,出一个数n,则1~n以内的正整数必定会有被去除的(假设被去除x1个),则这n个数中只有(n-x1)个数在Y数列中;如果想得到n个数在Y数列中,那么我们至少要在这n个数后面加上x1个数,设n1=n+x1,则在1~n1内的数有多少在Y数列中呢(假设有m个在Y数列中,去除了x2个)?如前面所说,在1~n1内的数最多有n个数在Y数列中(即m<=n),此时判断m与n是否相等。如果相等,则Y数列中第n个数为(n+x1);如果不相等,则继续在(n+x1)数后面再加x2个数,继续判断……一直加到某个数M,使得1~M内的数在Y数列中刚好有n个。关键在于如何求解在小于n的数里内有多少个数可以表示为a^b;
这时就要用到容斥原理了;

代码如下:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
int a[]={-2,-3,-5,-7,-11,-13,-17,-19,-23,-29,-31,-37,-41,-43,-47,-53,-59,-61,-67};
//选择负数是方便进行容斥原理
vectorG;
void get_su(int r){
    for(int i=0;abs(a[i])<=r;i++){
        int s=G.size();
        for(int j=0;j


你可能感兴趣的:(North--容斥原理,北门的智慧——组合数学)