結果
問題 | No.981 一般冪乗根 |
ユーザー |
![]() |
提出日時 | 2022-04-13 00:07:35 |
言語 | PyPy3 (7.3.15) |
結果 |
MLE
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 1,828 bytes |
コンパイル時間 | 203 ms |
コンパイル使用メモリ | 82,832 KB |
実行使用メモリ | 904,720 KB |
最終ジャッジ日時 | 2024-12-21 12:05:08 |
合計ジャッジ時間 | 165,499 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 26 TLE * 10 MLE * 8 |
ソースコード
from math import gcd, sqrtdef prime_factor(n):res = []x, y = n, 2while y * y <= x:if not x % y:res.append(y)while not x % y:x //= yy += 1if x > 1:res.append(x)return resdef primitive_root(m):if m == 2: return 1divs = prime_factor(m - 1)g = 2while True:for d in divs:if pow(g, (m - 1) // d, m) == 1: breakelse:return gg += 1def discrete_logarithm(x, y, m):if m == 1: return 0if y == 1: return 0if x == y == 0: return 1sq = int(sqrt(m)) + 1powx = {}p = 1for i in range(sq + 1):if p % m == y: return ipowx[p * y % m] = ip *= xp %= mz = pow(x, sq, m)g = zfor i in range(1, sq + 1):if g in powx:res = i * sq - powx[g]if pow(x, res, m) == y: return resg *= zg %= mreturn -1def inv_gcd(a, b):a %= bif a == 0: return b, 0s, t, m0, m1 = b, a, 0, 1while t:u = s // ts -= t * um0 -= m1 * us, t = t, sm0, m1 = m1, m0if m0 < 0: m0 += b // sreturn s, m0def inv_mod(x, m):g, im = inv_gcd(x, m)return imdef kth_root(k, y, p):if k == 0:if y == 1:return 0else:return -1if y == 0:return 0g = gcd(k, p - 1)m = (p - 1) // gif pow(a, m, p) != 1: return -1r = primitive_root(p)l = discrete_logarithm(r, y, p)if l % g: return -1res = pow(r, l // g * inv_mod(k // g, m) % m, p)return resimport sysinput = sys.stdin.buffer.readlineT = int(input())for _ in range(T):p, k, a = map(int, input().split())print(kth_root(k, a, p))