题目链接
题解:
让我们找到第k个没有平方因子的数,那么等价于
u
(
i
)
!
=
0
u(i)!=0
u(i)!=0,首先这个是具有单调性的所以可以二分。然后根据容斥原理求出区间内有多少个没有平方因子的数。
#include <bits/stdc++.h>
#define int long long
using namespace std;
typedef long long ll;
const ll inf = (1LL<<31)-1;
const int mod=1e6+3;
const int N=1e6+7;
int prime[N],vis[N],mob[N],cnt,n,k;
void init()
{
mob[1]=1;
for(int i=2;i<N;i++){
if(!vis[i]) prime[cnt++]=i,mob[i]=-1;
for(int j=0;i*prime[j]<N&&j<cnt;j++){
vis[prime[j]*i]=1;
if(i%prime[j]==0){
mob[prime[j]*i]=0;
break;
} mob[prime[j]*i]=-mob[i];
}
}
}
bool check(ll x)
{
ll res=0;
for(int i=1;i<=sqrt(x);i++) res+=x/(i*i)*mob[i];
return res>=k;
}
void work(){
init(); int T; ll mid;
cin>>T;
while(T--) {
cin>>k; ll l=1; ll r=inf; ll ans=inf;
while(l<=r) {
mid=(l+r)/2;
if(check(mid)) ans=mid,r=mid-1;
else l=mid+1;
}
printf("%lld\n",ans);
}
}
signed main()
{
work();
return 0;
}