BZOJ 2440 完全平方數(莫比烏斯函式+容斥)
阿新 • • 發佈:2019-02-01
注意的兩點是二分的時候注意,要選取最小的那個答案,因為19是13個,20也是13個,而很明顯19才是符合答案的。
還有感覺題目給的資料範圍不對,實際比較大,所以二分的時候r大點。
#include<bits/stdc++.h> using namespace std; const int maxn=1e5+10; int prime[maxn]; bool check[maxn]; int mu[maxn]; void moblus(){ memset(check,false,sizeof check); mu[1]=1; int tot=0; for(int i=2;i<maxn;i++){ if(!check[i]){ prime[tot++]=i; mu[i]=-1; } for(int j=0;j<tot;j++){ if(i*prime[j]>=maxn) break; check[i*prime[j]]=1; if(i%prime[j]==0){ mu[i*prime[j]]=0; break; }else{ mu[i*prime[j]]=-mu[i]; } } } } typedef long long ll; ll solve(ll mid){ ll ans=0; for(ll i=1;i*i<=mid;i++){ ans+=mu[i]*(mid/(i*i)); } return ans; } int main(){ moblus(); int T; scanf("%d",&T); while(T--){ ll n; scanf("%lld",&n); ll l=1; ll r=2e10; ll ans; while(l<=r){ ll mid=(l+r)>>1; if(solve(mid)<n){ l=mid+1; }else{ ans=mid; r=mid-1; } } printf("%lld\n",ans); } }