想不出什麼辦法能直接算的(別跟我提分塊打表),不如二分答案吧:設(f(x)=sum_{i=1}^n [i不是“完全平方數”]), 顯然f(x)與x正相關。再結合篩法、容斥,不難得到:
[
f(x)=sum_{i=1}^{sqrt x } mu(i)lfloorfrac{x}{i^2}
floor
]
找到那個滿足f(x)==k的x就行了。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
int mu[N],pr[N],cnt;
bool vis[N];
void predure() {
mu[1]=1;
for(int i=2; i<N; ++i) {
if(!vis[i]) mu[pr[++cnt]=i]=-1;
for(int j=1; j<=cnt && i*pr[j]<N; ++j) {
vis[i*pr[j]]=1;
if(i%pr[j]==0) break;
mu[i*pr[j]]=-mu[i];
}
}
}
int f(int x) {
int ret=0;
for(int i=1; i<=x/i; ++i) {
ret+=mu[i]*(x/(i*i));
}
return ret;
}
signed main() {
predure();
int T,k;
scanf("%lld",&T);
while(T--) {
scanf("%lld",&k);
int l=1,r=k*2,mid,ans;
while(l<=r) {
mid=(l+r)>>1;
if(f(mid)>=k) ans=mid,r=mid-1;
else l=mid+1;
}
printf("%lld
",ans);
}
return 0;
}