【每日算法】基础算法——筛除法求欧拉函数(六十二)

题目内容

给定一个正整数n,求1~n中每个数的欧拉函数之和。

输入格式

共一行,包含一个整数n。

输出格式

共一行,包含一个整数,表示1~n中每个数的欧拉函数之和。

数据范围

1≤n≤10^6

输入样例

6

输出样例

12

题解

1、如果i是质数,那么其欧拉函数值应为i-1
2、当i % primes[j] == 0时,说明primes[j]是i的一个质因子,根据欧拉公式,phi[i]一定乘过(1-1/primes[j])这一项,最终推出phi[primes[j] x i] = primes[j] x phi[i]
3、当i % primes[j] != 0时,说明primes[j]是i x primes[j]的一个最小质因子,最终推出phi[prime[j] x i] = phi[i] x (primes[j] - 1)

代码

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 1000010;
typedef long long LL;
int primes[N],cnt;
int phi[N];
bool st[N];

LL get_euler(int n){
phi[1] = 1;
for(int i = 2; i<= n; i++){
if(!st[i]){
primes[cnt++] = i;
phi[i] = i - 1;
}
for(int j = 0; primes[j] <= n / i; j++){
st[primes[j] * i] = true;
if(i % primes[j] == 0) {
phi[primes[j] * i] = primes[j] * phi[i];
break;
}
phi[primes[j] * i] = (primes[j] - 1) * phi[i];
}
}
LL res = 0;
for(int i = 1; i <= n; i++) res += phi[i];
return res;
}

int main(){
int n;
cin >> n;

cout << get_euler(n) << endl;

return 0;
}
Author: Frederic Niu
Link: https://www.fredericniu.cn/2021/01/29/【每日算法】基础算法——筛除法求欧拉函数(六十二)/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
我的公众号