【题目链接】
【思路要点】
- 补档博客,无题解。
【代码】
#include<bits/stdc++.h> using namespace std; #define MAXN 200005 template <typename T> void read(T &x) { x = 0; int f = 1; char c = getchar(); for (; !isdigit(c); c = getchar()) if (c == '-') f = -f; for (; isdigit(c); c = getchar()) x = x * 10 + c - '0'; x *= f; } int n, tot, prime[MAXN]; int f[MAXN], miu[MAXN]; void init() { miu[1] = 1; for (int i = 2; n / i / i; i++) { if (f[i] == 0) { f[i] = prime[++tot] = i; miu[i] = -1; } for (int j = 1; j <= tot && prime[j] <= f[i]; j++) { int tmp = prime[j] * i; if (n / tmp / tmp == 0) break; f[tmp] = prime[j]; if (prime[j] == f[i]) miu[tmp] = 0; else miu[tmp] = -miu[i]; } } } long long calc(int n, int m) { long long ans = 0; for (int b = 1; n / b / b; b++) { long long tmp = m / b; int nxt = 0; for (int s = b + 1; s <= 2 * b - 1; s = nxt + 1) { if (tmp / s == 0) break; nxt = tmp / (tmp / s); if (nxt < 2 * b - 1) ans += (tmp / s) * (nxt + 1 - s); else { ans += (tmp / s) * (2 * b - s); break; } } } return ans; } int main() { read(n); init(); long long ans = 0; for (int i = 1; n / i / i; i++) { if (miu[i] == 0) continue; ans += miu[i] * calc(n / i, n / i / i); } cout << ans << endl; return 0; }