题意:求第k个不包含完全平方因子的数。
思路:
很明显我们可以二分答案然后求当前mid之前有多少个满足题意的数。
根据容斥原理我们可以求n之前满足条件的数的个数ch(n)=n-包含一个完全平方因子的数+包含两个不同的完全平方因子的数-三个不同的完全平方因子的数。。。
就是 ch(n)=,我们通过观察可以发现g(1^2)=1,当i是奇数个不同的质数的乘积时g(i^2)=-1,当他是偶数个不同质数的乘积时g(i^2)=1,其他情况g(i^2)=0,那么就和懵逼乌斯函数联系到一起了,懵逼乌斯函数是当i为奇数个不同的质数的乘积时mu[i]=-1,当他是偶数个不同质数的乘积时mu[i]=1。
那么g(i^2)=mu(i),按照公式模拟即可。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
ll mu[1000005];
void init()
{
mu[1]=1;
ll maxn=1000000;
for(ll i=1;i<=maxn;i++)
{
for(ll j=2*i;j<=maxn;j+=i)
{
mu[j]-=mu[i];
}
}
}
ll ch(ll mid)
{
ll ans=0;
for(ll i=1;i*i<=mid;i++)
{
ans+=mu[i]*(mid/(i*i));
}
return ans;
}
int main()
{
init();
ll t;scanf("%lld",&t);
while(t--)
{
ll k;
scanf("%lld",&k);
ll l=0,r=2e9+7;
while(l<=r)
{
ll mid=(l+r)>>1;
if(ch(mid)>=k) r=mid-1;
else l=mid+1;
}
printf("%lld\n",l);
}
return 0;
}