[bzoj2440][中山市选2011]完全平方数
来自FallDream的博客,未经允许,请勿转载,谢谢。
T组询问,每次求第ki个没有完全平方因子的正整数。 T<=50 k<=10^9
很容易想到枚举平方因数,然后容斥原理。容斥因子可以直接求出,就是莫比乌斯函数。所以二分一个答案,就没啦。
复杂度$O(Tlogk\sqrt(k))$
#include<iostream> #include<cstdio> #define MN 100000 #define INF 2000000000 using namespace std; inline int read() { int x = 0 , f = 1; char ch = getchar(); while(ch < '0' || ch > '9'){ if(ch == '-') f = -1; ch = getchar();} while(ch >= '0' && ch <= '9'){x = x * 10 + ch - '0';ch = getchar();} return x * f; } int mu[MN+5],s[MN],num=0; bool b[MN+5]; int check(int x) { int sum=0; for(int i=1;i*i<=x;i++) sum+=(x/i/i)*mu[i]; return sum; } int main() { mu[1]=1; for(int i=2;i<=MN;i++) { if(!b[i]) s[++num]=i,mu[i]=-1; for(int j=1;s[j]*i<=MN;j++) { b[s[j]*i]=1; if(i%s[j]==0) break; mu[s[j]*i]=-mu[i]; } } for(int T=read();T;T--) { int x=read(),l=1,r=INF,ans,mid; while(l<=r) { mid=1LL*l+r>>1; if(check(mid)>=x) ans=mid,r=mid-1; else l=mid+1; } printf("%d\n",ans); } return 0; }
FallDream代表秋之国向您问好!
欢迎您来我的博客www.cnblogs.com/FallDream