题目
给定一个正整数n,求1~n中每个数的欧拉函数之和。
输入格式
共一行,包含一个整数n。
输出格式
共一行,包含一个整数,表示1~n中每个数的欧拉函数之和。
数据范围
1≤n≤
输入样例
6
输出样例
12
代码
#include <iostream>
using namespace std;
typedef long long ll;
const int N = 1000005;
int primes[N],euler[N],cnt;
bool st[N];
void get_eulers(int n){
euler[1] = 1;
for(int i = 2;i <= n;i++){
if(!st[i]){
primes[cnt++] = i;
euler[i] = i - 1;//质数n的欧拉函数值为n-1
}
for(int j = 0;primes[j] <= n / i;j++){
int t = i * primes[j];
st[t] = true;
if(i % primes[j] == 0){
euler[t] = euler[i] * primes[j];
break;
}
euler[t] = euler[i] * (primes[j] - 1);
}
}
}
int main(){
int n;
cin>>n;
get_eulers(n);
ll res = 0;
for(int i = 1;i <= n;i++) res += euler[i];
cout<<res<<endl;
return 0;
}