給定 n, m,求滿足 1 ≤ i < n 且 gcd(i, n) > m 的整數 i 的個數。多測試用例。
gcd(i, n) 的值必然是 n 的**約數**gcd(i, n) = d 的 i 個數gcd(i, n) = d ⇔ gcd(i/d, n/d) = 1 且 d | i1 ≤ k ≤ n/d 且 gcd(k, n/d) = 1因此答案 = Σd|n, d>m φ(n/d)
long long phi(long long x) {
long long res = x, a = x;
for (long long i = 2; i*i <= a; ++i) {
if (a % i == 0) {
res = res / i * (i - 1); // 先除後乘防溢出
while (a % i == 0) a /= i;
}
}
if (a > 1) res = res / a * (a - 1);
return res;
}
int main() {
int T; cin >> T;
while (T--) {
long long n, m; cin >> n >> m;
long long ans = 0;
for (long long d = 1; d*d <= n; ++d) {
if (n % d) continue;
if (d >= m && d*d != n) ans += phi(n/d);
if (n/d >= m) ans += phi(d);
}
cout << ans << '\n';
}
}
res = res / i * (i-1) 先除後乘,避免中間結果溢出 64 位本題核心是將「gcd 條件」轉化為「約數枚舉 + 歐拉函數」。利用 gcd(i,n)=d ⇔ gcd(i/d, n/d)=1 這一基本數論性質,配合約數成對枚舉技巧,實現極簡高效的解法。