题目
分析
莫比乌斯函数μ(i)=
(−1)k
(i为k个互不相等的素数的成绩),否则μ(i)=0
那么对于这题,可以想到用容斥原理,那么答案就是n-奇数个质数的平方的倍数的个数+偶数个质数的平方的倍数的个数
那么ans=Σμ[i]*(n/i^2) (i<=sqrt(n))
记得开long long
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define N 50005
#define ll long long
using namespace std;
int tot,mu[N],not_prime[N],prime[N];
void getmu(int n)
{
mu[1]=1;
for (int i=2;i<=n;i++)
{
if (!not_prime[i])
{
prime[++tot]=i;
mu[i]=-1;
}
for (int j=1;j<=tot&&prime[j]*i<=n;j++)
{
not_prime[i*prime[j]]=1;
if (i%prime[j]==0)
{
mu[i*prime[j]]=0;
break;
}
mu[i*prime[j]]=-mu[i];
}
}
}
ll cal(ll n)
{
ll ans=0;
int t=sqrt(n);
for (int i=1;i<=t;i++)
ans+=mu[i]*n/(i*i);
return ans;
}
int main()
{
getmu(50000);
int t,n;
scanf("%d",&t);
while (t--)
{
scanf("%d",&n);
ll l=n,r=1644934081;
while (l<=r)
{
ll mid=(l+r)/2;
if (cal(mid)>=n) r=mid-1;
else l=mid+1;
}
printf("%lld\n",r+1);
}
return 0;
}