CF1295D Same GCDs

原题链接

  • 题意:求 (sum _{x = 0}^{m-1}[gcd(a, m) = gcd(a + x, m)])
  • 题解:(d = gcd(a, m)) 然后发现 (gcd(a, m) = gcd(frac{a}{d}, frac{m}{d})) 并且 ((a+m) mod m) 的值域是 (left [0, m ight ))。随演变成求 (varphi(frac{m}{d}))
  • 代码:
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int N = 5e5 + 10;
vector<ll>V;
void solve() {
    V.clear();
    ll a, m;
    scanf("%lld%lld", &a, &m);
    ll d = __gcd(a, m);
    ll n = m/d;
    ll ans  = n;
    for (ll i = 2; i * i <= n; i ++) {
        if ( n % i == 0) {
            ans = ans/i * (i-1);
            while (n % i == 0)n/=i;
        }
    }
    if (n > 1) {
        ans = ans / n * (n - 1);
    }
    cout << ans  << endl;
}
int main() {
    int t = 1;cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Xiao-yan/p/14827528.html