题目内容
给定一个正整数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; }
|