command_block
2019-10-04 16:09:44
挺有意思的一个题。
题目要求我们求第
考虑二分答案转化为判定性问题,我们可以统计某个数前面有几个非平方数。
先是
我们可以考虑先减去
很明显我们算多了,再减去有两个因子的数的贡献。
又减多了,那么加上有三个因子的数的贡献……
如此就是莫比乌斯函数的体现,答案就是
复杂度
有时候容斥不那么容易想得到,那么就要推推式子:
设
反演一下就是
设
我们要求的就是
又因为
由此也得到一个有趣的结论:
// luogu-judger-enable-o2
#include<algorithm>
#include<cstdio>
#define MaxN 45678
using namespace std;
int T;
int tn,p[MaxN],mu[MaxN];
bool e[MaxN];
void getsth(int lim)
{
mu[1]=1;e[1]=1;
for (int i=2;i<=lim;i++){
if (!e[i]){
p[++tn]=i;
mu[i]=-1;
}
for (int j=1;j<=tn&&i*p[j]<=lim;j++){
e[i*p[j]]=1;
if (i%p[j]==0)break;
mu[i*p[j]]=-mu[i];
}
}
}
long long calc(long long n)
{
long long ans=0;
for (int i=1;1ll*i*i<=n;i++)
ans+=mu[i]*(n/(1ll*i*i));
return ans;
}
int main()
{
getsth(45000);
scanf("%d",&T);
while(T--){
long long l=1,r,mid,k;
scanf("%lld",&k);r=k+k+100;
while(l<r){
mid=(l+r)>>1;
if (calc(mid)>=k)r=mid;
else l=mid+1;
}printf("%lld\n",r);
}
}