Codeforces 920G(二分+容斥)

题意:

  定义F(x,p)表示的是一个数列{y},其中gcd(y,p)=1且y>x

  给出x,p,k,求出F(x,p)的第k项

  x,p,k<=10^6

分析:

  很容易想到先二分,再做差

  然后问题就变成了[1,x]内有多少个数是和p互质的

  我们可以先将p质因数分解,然后用这些数组合去在[1,x]容斥就行了

 1 long long cal(long long x)
 2 {
 3     int n=f.size();
 4     long long ans=0;
 5     for(int i=0;i<(1<<n);++i)
 6     {
 7         long long num=1;
 8         int sgn=1;
 9         for(int j=0;j<n;++j)
10             if((1<<j)&i) num*=f[j],sgn*=-1;
11         ans+=sgn*(x/num);
12     }
13     return ans;
14 }
View Code
原文地址:https://www.cnblogs.com/wmrv587/p/8410977.html