3 solutions
-
1
这道题我优化到最简了,可还是只能对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