本文共 1434 字,大约阅读时间需要 4 分钟。
欧拉函数φ(n)表示小于等于n且与n互质的正整数的个数。为了计算1到n中每个数的欧拉函数之和,我们可以使用线性筛法,这种方法的时间复杂度为O(n log log n),非常高效。
初始化数据结构:
st来标记是否已经被处理的数。primes来存储所有质数。遍历每个数:
primes数组,并设置st[i] = true。phi[i] = i - 1。处理质数的倍数:
phi[t] = phi[t/p] * p。phi[t] = phi[t/p] * (p - 1),并标记t为已处理。累加欧拉函数值:
#include#include #include using namespace std;typedef long long LL;const int N = 1e6 + 7;int primes[N], cnt;bool st[N];LL get_eulers(int n) { st[1] = true; for (int i = 2; i <= n; ++i) { if (!st[i]) { primes[cnt++] = i; st[i] = true; phi[i] = i - 1; } for (int j = 0; primes[j] <= n / i; ++j) { int t = primes[j] * i; st[t] = true; if (i % primes[j] == 0) { phi[t] = phi[i] * primes[j]; break; } phi[t] = 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;}
st数组用于标记已处理的数,primes数组存储质数,phi数组存储每个数的欧拉函数值。primes数组,并计算其欧拉函数值。这种方法高效且适用于大范围的n,能够快速计算1到n的欧拉函数之和。
转载地址:http://gaefk.baihongyu.com/