二分答案,求1~n里有多少个非完全平方数。
ans=n - (n/2^2) - (n/3^2) - (n/5^2) - (n/7^2)……
然后再加上出现两次的,减去出现三次的……
这是莫比乌斯函数。
#include<cmath>
#include<cstdio>
#include<iostream>
#define maxn 60005
#define LL long long
using namespace std;
int mu[maxn];
bool use[maxn];
int prime[maxn],cnt;
void get_mu()
{
int N=60000;mu[1]=1;
for(int i=2;i<=N;i++)
{
if(!use[i])
{mu[i]=-1;prime[++cnt]=i;}
for(int j=1;j<=cnt;j++)
{
if((LL)i*prime[j]>(LL)N) break;
use[i*prime[j]]=1;
if(i%prime[j]==0)
{mu[i*prime[j]]=0;break;}
mu[i*prime[j]]=-mu[i];
}
}
for(int i=2;i<=N;i++)
mu[i]+=mu[i-1];
}
int k;
bool check(int x)
{
int l=1,r;
int mx=sqrt(x);
LL cnt=0;
while(l<=mx)
{
int p=x/(l*l);
r=sqrt(x/p);
cnt+=(LL)(mu[r]-mu[l-1])*(x/(l*l));
l=r+1;
}
return cnt>=k;
}
int main()
{
int T;
scanf("%d",&T);
get_mu();
while(T--)
{
scanf("%d",&k);
LL l=0,r=k*2+1;
while(r-l>1)
{
LL mid=l+r>>1;
if(check(mid)) r=mid;
else l=mid;
}
printf("%lld\n",r);
}
return 0;
}