http://www.elijahqi.win/archives/1201
这个分块和之前的差不多 x/(x/i*i) 就是相同值的最后一个i在哪里然后开方即可
我们所要做的就是求出第k个质因数不唯一的数
不可识别等价于求有多少个因数为素数平方的数 那么像2 3 这种会重复算6的我们可以用莫比乌斯函数来搞这个 (容斥原理)
#include<cstdio>
#include<cmath>
#define ll long long
#define N 1100000
ll k;int mu[N],prime[N],not_prime[N];
inline bool check(ll mid){
long long last=0,ans=0;
for (int i=2;i<=sqrt(mid);i=last+1){
ll d=(ll)i*i;last=sqrt(mid/(mid/d));
ans+=mid/d*(mu[last]-mu[i-1]);
}
/*for (int i=2;i<=sqrt(mid);++i){
ll d=(ll)i*i;ans+=mid/d*mu[i];
}*/
ans*=-1;
return ans>=k;
}
int main(){
freopen("1889.in","r",stdin);
scanf("%lld",&k);mu[1]=1;int top=0;
for (int i=2;i<=1000000;++i){
if (!not_prime[i]){
mu[i]=-1;prime[++top]=i;
}
for (int j=1;i*prime[j]<=1000000;++j){
not_prime[i*prime[j]]=true;
if (i%prime[j]==0){
mu[i*prime[j]]=0;break;
}mu[i*prime[j]]=-mu[i];
}
}
//for (int i=1;i<=30;++i) printf("%d ",mu[i]);
for (int i=2;i<=1000000;++i) mu[i]+=mu[i-1];
ll l=1,r=1e11;
while (l<=r){
ll mid=l+r>>1;
if (check(mid)) r=mid-1;else l=mid+1;
}
printf("%lld",l);
return 0;
}