AcWing 874. 筛法求欧拉函数
原题链接
简单
作者:
阿飞被注册了
,
2021-04-20 20:42:47
,
所有人可见
,
阅读 253
C++ 代码
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdio>
using namespace std;
const int N = 1e6 + 10;
int primes[N], phi[N];
bool str[N];
int n;
void get_ola(int n)
{
phi[1] = 1;
int cnt = 0;
//线性筛
for(int i = 2; i <= n; i++)
{
if(!str[i])
{
primes[cnt++] = i;
//质数的欧拉数为:i-1(1~~i-1都与i互质)
phi[i] = i - 1;
}
for(int j = 0; primes[j] <= n/i; j++)
{
str[primes[j] * i] = true;
int t = primes[j] * i;
//primes[j] 为i的质数时,primes[j]也是primes[j] * i的质数,所以phi[primes[j] * i] = phi[i] * primes[j];
if(i % primes[j] == 0)
{
phi[t] = phi[i] * primes[j];
break;
}
//primes[j] 不为 i的质因子时
phi[t] = phi[i] * (primes[j] - 1);
}
}
}
int main()
{
cin >> n;
get_ola(n);
long long ans = 0;
for(int i = 1; i <= n; i++)
ans += phi[i];
cout << ans <<endl;
return 0;
}
stack [HTML_REMOVED] st;
栈为空的话 cout << st.top(), 会越界,发生段错误