1. 程式人生 > >【二分+莫比烏斯函式】BZOJ2440 [中山市選2011]完全平方數

【二分+莫比烏斯函式】BZOJ2440 [中山市選2011]完全平方數

題面在這裡

顯然需要二分……

問題轉化為求[1,n]中無平方因子數的個數

根據容斥原理,顯然答案為n+

如果列舉這個乘積i,根據莫比烏斯函式的定義,答案為:

i=1nμ(i)ni2
然後就好了

示例程式:

#include<cstdio>
#include<cmath>
typedef long long ll;

const int maxn=100000;
int m=maxn-5,mu[maxn],p[maxn];
bool vis[maxn];
ll tst,L,R,K,ans;
void
get_mu(){ mu[1]=1; for (int i=2;i<=m;i++){ if (!vis[i]) p[++p[0]]=i,mu[i]=-1; for (int j=1;j<=p[0]&&i*p[j]<=m;j++){ vis[i*p[j]]=1; if (i%p[j]==0){mu[i*p[j]]=0;break;} else mu[i*p[j]]=-mu[i]; } } } bool check(ll mid){ ll sm=sqrt
(mid),res=0; for (ll i=1;i<=sm;i++) res+=mu[i]*(mid/(i*i)); return res>=K; } int main(){ scanf("%lld",&tst); get_mu(); while (tst--){ scanf("%lld",&K); ans=0;L=1,R=1e10; while (L<=R){ ll mid=L+R>>1; if (check(mid)) R=mid-1
,ans=mid;else L=mid+1; } printf("%lld\n",ans); } return 0; }