POJ 3696 The Luckiest number 数论,GCD

发此随笔以警示自己不要乱实现。

枚举因子的时候多加留心,实现能力还是太差了。

ll get_phi(ll n) {
    ll m = ll(sqrt(n + 0.5));
    ll ans = n;
    for (int i = 2; i <= m; i++) {
        if (n % i == 0) {
            ans = ans / i * (i - 1);
            while (n % i == 0) n /= i;
        }
    }
    if (n > 1) ans = ans / n * (n - 1);
    return ans;
}

ll gcd(ll a, ll b) {
    return b == 0 ? a : gcd(b, a % b);
}


int main() {
    ll n;
    int kase = 1;
    while (n = readll()) {
        if (!n) break;
        printf("Case %d: ", kase++);
        n = 9 * n / gcd(n, 8ll);
        ll res = inf;
        ll phi = get_phi(n);
        for (ll i = 1; i * i <= phi; i++) {
            if (phi % i) continue;
            if (phi % i == 0) if (quickPower(10ll, i, n) == 1ll) res = min(res, i);
            if (i * i != phi) if (quickPower(10ll, phi / i, n) == 1ll) res = min(res, phi / i);
        }
        if (res == inf) puts("0");
        else printf("%d\n", res);
    }
}
原文地址:https://www.cnblogs.com/hznumqf/p/13412531.html