题目大意
找到从小到大第k个不含有平方因子的数。
二分答案+容斥原理
首先我们可以很容易想到二分答案,然后转化为一个判定性问题。
那么现在要解决的是如何求1~n内有多少不含平方因子的数。
可以想到容斥原理。
即
ans=∑(−1)i∗n以内含有至少i个平方因子的数
莫比乌斯函数
观察上面的式子,转化一下
ans=∑√ni=1n/(i∗i)∗(−1)i含有的平方因子的个数
后面部分其实就是i的莫比乌斯函数值!
注意别忘了mu[1]=1
#include<cstdio>
#include<algorithm>
#include<cmath>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
typedef long long LL;
int pri[50000+10],mu[50000+10];
bool bz[50000+10];
int i,j,k,t,n,m,ca,top;
LL l,r,mid;
int get(int n){
int i,ans=0;
fo(i,1,floor(sqrt(n))) ans+=n/(i*i)*mu[i];
return ans;
}
int main(){
mu[1]=1;
fo(i,2,50000){
if (!bz[i]){
mu[i]=-1;
pri[++top]=i;
}
fo(j,1,top){
if ((LL)i*pri[j]>50000) break;
bz[i*pri[j]]=1;
if (i%pri[j]==0){
mu[i*pri[j]]=0;
break;
}
mu[i*pri[j]]=-mu[i];
}
//printf("%d\n",i);
}
scanf("%d",&ca);
while (ca--){
scanf("%d",&k);
l=1;r=1644934081;
while (l<r){
mid=(LL)(l+r)/2;
if (get(mid)>=k) r=mid;else l=mid+1;
}
printf("%d\n",l);
}
}