线性筛求莫比乌斯函数练手题,具体见代码。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#define ll long long
using namespace std;
const int maxn=500000;
int mu[maxn],prime[maxn],tot;
bool mark[maxn];
void get_mu(int n)
{
mu[1]=1;
for(int i=2;i<=n;i++)
{
if(!mark[i])
{
prime[++tot]=i;mu[i]=-1;
}
for(int j=1;prime[j]*i<=n;j++)
{
mark[prime[j]*i]=1;
if(i%prime[j]==0)
{
mu[prime[j]*i]=0;break;
}
mu[prime[j]*i]=-mu[i];
}
}
}
ll calc(int x)
{
ll res=0;
int t=sqrt(x);
for(int i=1;i<=t;i++)
res+=x/(i*i)*mu[i];
return res;
}
ll T,k,ans;
int main()
{
scanf("%d",&T);
get_mu(400000);
while(T--)
{
scanf("%lld",&k);
ll l=1,r=2147483647;
while(r>=l)
{
ll mid=(l+r)>>1;
if(calc(mid)>=k)
{
ans=mid,r=mid-1;
}
else l=mid+1;
}
printf("%lld\n",ans);
}
return 0;
}