1. 程式人生 > 實用技巧 >POJ 3696 The Luckiest number 數論,GCD

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); } }