【题目链接】
【思路要点】
- 补档博客,无题解。
【代码】
#include<bits/stdc++.h> using namespace std; #define MAXN 10000005 int tot, prime[MAXN], f[MAXN], miu[MAXN], cnt[MAXN]; int g[MAXN], sum[MAXN]; bool mark[MAXN]; int main() { for (int i = 2; i < MAXN; i++) { if (f[i] == 0) { prime[++tot] = i; f[i] = i; miu[i] = -1; cnt[i] = 1; } for (int j = 1; j <= tot && prime[j] <= f[i]; j++) { int tmp = prime[j] * i; if (tmp >= MAXN) break; f[tmp] = prime[j]; if (prime[j] == f[i]) { miu[tmp] = 0; cnt[tmp] = cnt[i]; } else { miu[tmp] = -miu[i]; cnt[tmp] = cnt[i] + 1; } } } for (int i = 2; i < MAXN; i++) { if (miu[i] == 0) continue; long long tmp = i; while (tmp < MAXN) { if (cnt[i] & 1) g[tmp] = 1; else g[tmp] = -1; tmp *= i; } } for (int i = 2; i < MAXN; i++) sum[i] = sum[i - 1] + g[i]; int T; scanf("%d", &T); while (T--) { long long a, b, ans = 0; scanf("%lld%lld", &a, &b); int i = 1; while (i <= a && i <= b) { int next = a / (a / i); int mext = b / (b / i); if (next <= mext) { ans += (sum[next] - sum[i - 1]) * (a / i) * (b / i); i = next + 1; } else { ans += (sum[mext] - sum[i - 1]) * (a / i) * (b / i); i = mext + 1; } } printf("%lld\n", ans); } return 0; }