結果
問題 | No.981 一般冪乗根 |
ユーザー | toyuzuko |
提出日時 | 2022-04-13 00:07:35 |
言語 | PyPy3 (7.3.15) |
結果 |
MLE
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 1,828 bytes |
コンパイル時間 | 176 ms |
コンパイル使用メモリ | 82,408 KB |
実行使用メモリ | 634,548 KB |
最終ジャッジ日時 | 2024-06-01 07:44:50 |
合計ジャッジ時間 | 167,596 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2,319 ms
225,964 KB |
testcase_01 | AC | 2,229 ms
225,824 KB |
testcase_02 | AC | 2,335 ms
446,032 KB |
testcase_03 | MLE | - |
testcase_04 | MLE | - |
testcase_05 | AC | 147 ms
83,328 KB |
testcase_06 | AC | 151 ms
135,940 KB |
testcase_07 | AC | 144 ms
134,908 KB |
testcase_08 | AC | 145 ms
135,484 KB |
testcase_09 | AC | 144 ms
76,440 KB |
testcase_10 | AC | 144 ms
76,740 KB |
testcase_11 | AC | 153 ms
76,308 KB |
testcase_12 | AC | 142 ms
76,572 KB |
testcase_13 | AC | 144 ms
76,456 KB |
testcase_14 | AC | 144 ms
76,392 KB |
testcase_15 | AC | 148 ms
76,880 KB |
testcase_16 | AC | 144 ms
76,584 KB |
testcase_17 | AC | 141 ms
76,472 KB |
testcase_18 | AC | 143 ms
76,320 KB |
testcase_19 | AC | 141 ms
76,296 KB |
testcase_20 | AC | 144 ms
76,532 KB |
testcase_21 | AC | 141 ms
76,508 KB |
testcase_22 | AC | 149 ms
76,480 KB |
testcase_23 | AC | 140 ms
76,332 KB |
testcase_24 | AC | 145 ms
76,440 KB |
testcase_25 | AC | 4,050 ms
198,680 KB |
testcase_26 | AC | 3,673 ms
193,556 KB |
testcase_27 | AC | 68 ms
69,272 KB |
testcase_28 | AC | 3,627 ms
196,944 KB |
evil_60bit1.txt | TLE | - |
evil_60bit2.txt | TLE | - |
evil_60bit3.txt | TLE | - |
evil_hack | AC | 46 ms
60,996 KB |
evil_hard_random | TLE | - |
evil_hard_safeprime.txt | TLE | - |
evil_hard_tonelli0 | TLE | - |
evil_hard_tonelli1 | TLE | - |
evil_hard_tonelli2 | MLE | - |
evil_hard_tonelli3 | TLE | - |
evil_sefeprime1.txt | TLE | - |
evil_sefeprime2.txt | TLE | - |
evil_sefeprime3.txt | TLE | - |
evil_tonelli1.txt | TLE | - |
evil_tonelli2.txt | TLE | - |
ソースコード
from math import gcd, sqrt def prime_factor(n): res = [] x, y = n, 2 while y * y <= x: if not x % y: res.append(y) while not x % y: x //= y y += 1 if x > 1: res.append(x) return res def primitive_root(m): if m == 2: return 1 divs = prime_factor(m - 1) g = 2 while True: for d in divs: if pow(g, (m - 1) // d, m) == 1: break else: return g g += 1 def discrete_logarithm(x, y, m): if m == 1: return 0 if y == 1: return 0 if x == y == 0: return 1 sq = int(sqrt(m)) + 1 powx = {} p = 1 for i in range(sq + 1): if p % m == y: return i powx[p * y % m] = i p *= x p %= m z = pow(x, sq, m) g = z for i in range(1, sq + 1): if g in powx: res = i * sq - powx[g] if pow(x, res, m) == y: return res g *= z g %= m return -1 def inv_gcd(a, b): a %= b if a == 0: return b, 0 s, t, m0, m1 = b, a, 0, 1 while t: u = s // t s -= t * u m0 -= m1 * u s, t = t, s m0, m1 = m1, m0 if m0 < 0: m0 += b // s return s, m0 def inv_mod(x, m): g, im = inv_gcd(x, m) return im def kth_root(k, y, p): if k == 0: if y == 1: return 0 else: return -1 if y == 0: return 0 g = gcd(k, p - 1) m = (p - 1) // g if pow(a, m, p) != 1: return -1 r = primitive_root(p) l = discrete_logarithm(r, y, p) if l % g: return -1 res = pow(r, l // g * inv_mod(k // g, m) % m, p) return res import sys input = sys.stdin.buffer.readline T = int(input()) for _ in range(T): p, k, a = map(int, input().split()) print(kth_root(k, a, p))