1 条题解
-
0
#include <bits/stdc++.h> using namespace std; const int MAXN = 40005; //pri[1]~pri[cnt] int pri[MAXN], phi[MAXN], cnt; bool vis[MAXN]; void init() { phi[1] = 1; for (int i = 2; i < MAXN; ++i) { if (!vis[i]) { phi[i] = i - 1; pri[cnt++] = i; } for (int j = 0; j < cnt; ++j) { if (1ll * i * pri[j] >= MAXN) break; vis[i * pri[j]] = 1; if (i % pri[j]) { phi[i * pri[j]] = phi[i] * (pri[j] - 1); } else { // i % pri[j] == 0 // 换言之,i 之前被 pri[j] 筛过了 // 由于 pri 里面质数是从小到大的,所以 i 乘上其他的质数的结果一定也是 // pri[j] 的倍数 它们都被筛过了,就不需要再筛了,所以这里直接 break // 掉就好了 phi[i * pri[j]] = phi[i] * pri[j]; break; } } } } int n, q, x; int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n; if (n == 1) { cout << 0 << endl; return 0; } init(); int ans = 0; for (int i = 1; i < n; i++) ans += phi[i]; cout << ans * 2 + 1 << endl; return 0; }
- 1
信息
- ID
- 1268
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- 递交数
- 31
- 已通过
- 14
- 上传者