先用二分把问题转化一下,然后利用容斥定理和莫比乌斯函数搞一搞就好了。
/**************************************************************
Problem: 2440
User: mybing
Language: C++
Result: Accepted
Time:4908 ms
Memory:2556 kb
****************************************************************/
#include<bits/stdc++.h>
using namespace std;
int f[100010],tot=0,prime[100010],mu[100010],T,n;
bool not_prime[100010];
bool pd(long long p,long long w)
{
long long sum=0;
for(long long i=1;i*i<=p;i++)
{
sum+=p/(i*i)*mu[i];
}
if(sum>=w)return true;
else return false;
}
void work(int p)
{
long long l=1,r=3000000000;
while(l+1<r)
{
long long mid=(l+r)>>1;
if(pd(mid,(long long)p))r=mid;
else l=mid;
}
if(pd(l,n))printf("%lld\n",l);
else printf("%lld\n",r);
}
int main()
{
memset(not_prime,true,sizeof(not_prime));
mu[1]=1;
for(int i=2;i<=100000;i++)
{
if(not_prime[i])
{
prime[++tot]=i;
mu[i]=-1;
}
for(int j=1;j<=tot&&i*prime[j]<=100000;j++)
{
not_prime[i*prime[j]]=false;
if(i%prime[j]==0)
{
not_prime[prime[j]*i]=false;
mu[prime[j]*i]=0;
break;
}
mu[i*prime[j]]=-1*mu[i];
}
}
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
work(n);
}
return 0;
}