求指定区间内与n互素的数的个数 容斥原理

题意:给定整数n和r,求区间[1, r]中与n互素的数的个数。


使, 1...n, gcd(i,n)1log(max(i,n)),rlog(max(i,n))
r


[1,r]n
nPi(i=1...k), , 
, 

6223(使)
k, rk[1,r]k

详细见容斥定理

详细代码如下

int solve(int r, int n) {
    vector<int>p;
    p.clear();
    for(int i = 2; i*i <= n; ++i) {
        if(n % i == 0) {
            p.push_back(i);
            while(n % i == 0) n /= i;
        }
    }
    if(n > 1) p.push_back(n); //可能n也是素数
    int sum = 0;
    for(int msk = 1; msk < (1<int mult = 1, bits = 0;
        for(int i = 0; i < p.size(); ++i) {
            if(msk & (1<//选择了第i个素数因子 
                bits++; 
                mult *= p[i];
            }
        }
        int cur = r / mult;
        if(bits & 1) sum += cur;
        else sum -= cur;
    } 
    return r - sum;
}

n, r

如有不当之处欢迎指出!

你可能感兴趣的:(算法之路,容斥定理,组合数学)