bzoj2440 [中山市选2011]完全平方数——莫比乌斯+容斥
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2440
莫比乌斯...被难倒...
看TJ:http://hzwer.com/4827.html
再看TJ:https://blog.csdn.net/xiefubao/article/details/30567715
努力抄写理解...
代码如下:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; typedef long long ll; int const maxn=50005; ll const inf=1e18; int T,cnt,mu[maxn],pri[maxn],n; ll l,r,ans; bool vis[maxn]; void init() { mu[1]=1;// for(int i=2;i<=maxn;i++) { if(!vis[i])pri[++cnt]=i,mu[i]=-1; for(int j=1;j<=cnt&&pri[j]*i<=maxn;j++) { vis[i*pri[j]]=1; if(i%pri[j]==0) { mu[i*pri[j]]=0; break;//原本就有平方因子者贡献为0 } mu[i*pri[j]]=-mu[i];//根据质因子种类数 } } } ll calc(int x) { ll sum=0; for(int i=1;i*i<=x;i++)//1 // sum+=mu[i]/(i*i)*x;//mu 仅为 1 或 -1 sum+=x/(i*i)*mu[i];//i*i -> 产生平方因子 return sum; } int main() { scanf("%d",&T); init(); while(T--) { scanf("%d",&n); l=n; r=1644934081;// while(l<=r) { ll mid=(l+r)/2; if(calc(mid)>=n)ans=mid,r=mid-1; else l=mid+1; } printf("%lld\n",ans); } return 0; }