AcWing 874. 筛法求欧拉函数
原题链接
简单
作者:
别期待太多
,
2024-10-14 19:54:27
,
所有人可见
,
阅读 4
#include<iostream>
#include<cstdio>
using namespace std;
const int N = 1e6+10;
int n, cnt, prime[N], phi[N];
bool sta[N];
void get_ola(int n)
{
phi[1] = 1;
for(int i = 2; i <= n; i ++)
{
if(sta[i] == false)
{
prime[cnt++] = i;//计入质数
phi[i] = i-1;//质数的欧拉函数
}
//对于每个i都要尝试循环
for(int j = 0; prime[j] <= n/i; j ++)
{
sta[prime[j]*i] = true;//先筛去
if(i % prime[j] == 0)
{
phi[prime[j]*i] = phi[i]*prime[j];
break;
}
else
{
phi[prime[j]*i] = phi[i]*(prime[j]-1);
}
}
}
}
int main()
{
scanf("%d", &n);
get_ola(n);
long long res = 0;
for(int i = 1; i <= n; i ++)
res += phi[i];
printf("%lld", res);
return 0;
}