考虑二分答案。而且1..n中他喜欢的大概占3/5左右。
考虑莫比乌斯函数与容斥原理,得答案。
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #define maxn 100050 using namespace std; long long t,n,miu[maxn],prime[maxn],cnt=0; bool vis[maxn]; void get_table() { miu[1]=1; for (long long i=2;i<=maxn;i++) { if (vis[i]==false) { vis[i]=true; prime[++cnt]=i; miu[i]=-1; } for (long long j=1;j<=cnt && i*prime[j]<=maxn;j++) { vis[i*prime[j]]=true; if (i%prime[j]==0) { miu[i*prime[j]]=0; break; } else miu[i*prime[j]]=-miu[i]; } } } long long cal(long long x) { long long r=sqrt(x),ret=0; for (long long i=1;i<=r;i++) ret+=x/(i*i)*miu[i]; return ret; } void work() { scanf("%lld",&n); long long l=1,r=2000000000,ans; while (l<=r) { long long mid=(l+r)>>1; long long now=cal(mid); if (now>=n) {ans=mid;r=mid-1;} else l=mid+1; } printf("%lld\n",ans); } int main() { scanf("%lld",&t); get_table(); for (long long i=1;i<=t;i++) work(); return 0; }