其实和bzoj2440一模一样。
就是利用Mobius函数来容斥就好了
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 500010
inline char gc(){
static char buf[1<<16],*S,*T;
if(T==S){T=(S=buf)+fread(buf,1,1<<16,stdin);if(T==S) return EOF;}
return *S++;
}
inline ll read(){
ll x=0,f=1;char ch=gc();
while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=gc();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=gc();
return x*f;
}
int mu[N],prime[N>>3],tot=0;
bool notprime[N];
inline void init(){
notprime[1]=1;mu[1]=1;
for(int i=2;i<=N-10;++i){
if(!notprime[i]) prime[++tot]=i,mu[i]=-1;
for(int j=1;prime[j]*i<=N-10;++j){
notprime[prime[j]*i]=1;
if(i%prime[j]==0){mu[i*prime[j]]=0;break;}
mu[i*prime[j]]=-mu[i];
}
}
}
inline ll calc(ll n){
int m=sqrt(n);ll res=0;
for(ll i=2;i<=m;++i) res-=mu[i]*(n/(i*i));
return res;
}
int main(){
// freopen("a.in","r",stdin);
ll K=read(),l=4,r=K<<2;init();
while(l<=r){
ll mid=l+r>>1;
if(calc(mid)>=K) r=mid-1;
else l=mid+1;
}printf("%lld\n",r+1);
return 0;
}