主要考察的是线性筛法欧拉函数
关于线性素数筛与非线性的区别,我以前写过,差别不是很大
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn=1e7+7;
long long prime[maxn],phi[maxn],n,totprime;
long long ans=0;
bool vis[maxn];
int main()
{
scanf("%lld",&n);
phi[1]=1;
for (int i=2;i<=n;i++)
{
if (!phi[i])
{
prime[totprime++]=i;
phi[i]=i-1;
}
for (int j=0;j<totprime&&i*prime[j]<=n;j++)
{
if (i%prime[j])
phi[i*prime[j]]=phi[i]*(prime[j]-1);
else
{
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
}
}
for (int i=2;i<=n;i++)
phi[i]+=phi[i-1];
for (int i=0;i<totprime;i++)
ans+=phi[n/prime[i]]*2-1;
printf("%lld\n",ans);
return 0;
}
参考资料: