P3455 题目: 给出a, b, d, 求 1 <= x <= a, 1 <= y <= b, gcd(x, y) = d的个数 #include<iostream> #include<cstring> #include<cstdio> using namespace std; typedef long long ll; const int N = 1e5 + 7; ll miu[N], v[N]; ll sum[N]; void getmiu(int n) { for(int i = 1; i <= n; i++) v[i] = 0, miu[i] = 1; for(int i = 2; i <= n; i++) { if(v[i]) continue; miu[i] = -1; for(int j = 2 * i; j <= n; j += i) { v[j] = 1; if((j / i) % i == 0) miu[j] = 0; else miu[j] *= -1; } } for(int i = 1; i <= n; i++) sum[i] = sum[i - 1] + miu[i]; } int main() { getmiu(50000); int t; scanf("%d", &t); while(t--) { ll a, b, k; scanf("%lld %lld %lld", &a, &b, &k); ll l, r; a /= k; b /= k; ll ans = 0; for(l = 1; l <= min(a, b); l = r + 1) { r = min(a / (a / l), b / (b / l)); ans = ans + ((sum[r] - sum[l - 1]) * (a / l) * (b / l)); } printf("%lld\n", ans); } return 0; }