BZOJ_2440_[中山市选2011]完全平方数_容斥原理+线性筛
BZOJ_2440_[中山市选2011]完全平方数_容斥原理
题意:
求第k个不是完全平方数倍数的数
分析:
二分答案,转化成1~x中不是完全平方数倍数的数的个数
答案=所有数-1个质数的平方的倍数+2个质数乘积的平方的倍数
=x-x/2^2-x/3^2+x/4^2-x/5^2+x/6^2
发现容斥的系数就是μ
线性筛即可
代码:
#include <stdio.h> #include <string.h> #include <algorithm> #include <bitset> using namespace std; #define LL long long int T,n; bitset<100010>vis; LL ans; int prime[100010],miu[100010],cnt; void init(){ int i,j; miu[1]=1; for(i=2;i<=100000;i++){ if(!vis[i]){ prime[++cnt]=i; miu[i]=-1; } for(j=1;j<=cnt&&i*prime[j]<=100000;j++){ vis[i*prime[j]]=1; if(i%prime[j]==0){ miu[i*prime[j]]=0;break; } miu[i*prime[j]]=-miu[i]; } } } LL check(LL x){ LL i; LL re=0; for(i=1ll;i*i<=x;i++){ re+=miu[i]*x/(i*i); } return re; } int main(){ scanf("%d",&T); init(); while(T--){ scanf("%d",&n); LL l=0,r=1ll<<33; while(l<r){ LL mid=l+r>>1ll; if(check(mid)>=n)r=mid; else l=mid+1; } printf("%lld\n",l); } }