篩數求尤拉函式
阿新 • • 發佈:2021-07-22
篩數求尤拉函式
給定一個正整數 nn,求 1∼n1∼n 中每個數的尤拉函式之和。
輸入格式
共一行,包含一個整數 nn。
輸出格式
共一行,包含一個整數,表示 1∼n1∼n 中每個數的尤拉函式之和。
資料範圍
1≤n≤1061≤n≤106
輸入樣例:
6
輸出樣例:
12
#include <iostream> #include <algorithm> using namespace std; typedef long long LL; const int N = 1000010; int primes[N], cnt; int phi[N]; bool st[N]; LL get_eulers(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] = phi[i] * primes[j]; break; } phi[primes[j] * i] = phi[i] * (primes[j] - 1); } } LL res = 0; for (int i = 1; i <= n; i++) { res += phi[i]; } return res; } int main() { int n; cin >> n; cout << get_eulers(n) << endl; return 0; }