3 solutions

  • 1
    @ 2025-9-8 19:07:54

    这道题我优化到最简了,可还是只能对3个样例先发出来吧,等我找到过的方法再修改

    #pragma GCC optimize("Ofast")
    #pragma GCC optimize("unroll-loops")
    #include <cstdio>
    #define ll long long
    
    inline ll read() {
        ll x = 0; char c = getchar();
        while (c < '0' || c > '9') c = getchar();
        while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + c - '0', c = getchar();
        return x;
    }
    
    inline void write(ll x) {
        if (x < 0) putchar('-'), x = -x;
        if (x > 9) write(x / 10);
        putchar(x % 10 + '0');
    }
    
    inline ll mul(ll a, ll b, ll mod) {
        return (__int128)a * b % mod;
    }
    
    inline ll pow_mod(ll a, ll b, ll mod) {
        ll res = 1;
        for (; b; b >>= 1, a = mul(a, a, mod))
            if (b & 1) res = mul(res, a, mod);
        return res;
    }
    
    int main() {
        ll p = read(), b = read(), n = read();
        
        ll phi = p - 1, c2 = 0, c3 = 0, t = phi;
        while (!(t & 1)) t >>= 1, c2++;
        while (t % 3 == 0) t /= 3, c3++;
        
        ll p2 = 1, p3 = 1;
        for (int i = 0; i < c2; i++) p2 <<= 1;
        for (int i = 0; i < c3; i++) p3 *= 3;
        
        auto solve_log = [&](ll g, ll h, ll mod, ll order) {
            ll res = 1;
            for (ll i = 0; i < order; i++) {
                if (res == h) return i;
                res = mul(res, g, mod);
            }
            return -1LL;
        };
        
        ll x1 = 0, x2 = 0;
        if (p2 > 1) {
            ll g1 = pow_mod(b, phi / p2, p);
            ll h1 = pow_mod(n, phi / p2, p);
            x1 = solve_log(g1, h1, p, p2);
            if (x1 == -1) {puts("-1"); return 0;}
        }
        if (p3 > 1) {
            ll g2 = pow_mod(b, phi / p3, p);
            ll h2 = pow_mod(n, phi / p3, p);
            x2 = solve_log(g2, h2, p, p3);
            if (x2 == -1) {puts("-1"); return 0;}
        }
        
        if (p2 == 1) write(x2);
        else if (p3 == 1) write(x1);
        else {
            for (ll i = x1; i < p2 * p3; i += p2) {
                if (i % p3 == x2) {
                    write(i);
                    return 0;
                }
            }
            puts("-1");
        }
        
        return 0;
    }
    

    Information

    ID
    61
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    6
    Tags
    # Submissions
    412
    Accepted
    8
    Uploaded By