题意
一个正整数K被称为squarefree,如果它没有一个D^2(D>1)这样的约数。
找出第N个不是squarefree的数。1<=N<=10^10
分析
显然可以二分答案,然后就要求不大于一个数的平方因子数。
只要用容斥搞一搞就好了。
具体来讲,答案就是
∑i=2n−μ(i)⌊ni2⌋
∑
i
=
2
n
−
μ
(
i
)
⌊
n
i
2
⌋
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N=1000005;
LL n;
int tot,prime[N],mu[N];
bool not_prime[N];
void get_prime(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&&i*prime[j]<=n;j++)
{
not_prime[i*prime[j]]=1;
if (i%prime[j]==0) break;
mu[i*prime[j]]=-mu[i];
}
}
}
LL check(LL mid)
{
LL ans=0;
for (int i=2;(LL)i*i<=mid;i++)
ans+=(LL)-mu[i]*(mid/i/i);
return ans;
}
int main()
{
get_prime(1000000);
scanf("%lld",&n);
LL l=4,r=n*10;
while (l<=r)
{
LL mid=(l+r)/2;
if (check(mid)>=n) r=mid-1;
else l=mid+1;
}
printf("%lld",r+1);
return 0;
}