結果
問題 | No.981 一般冪乗根 |
ユーザー | toyuzuko |
提出日時 | 2022-04-12 23:56:45 |
言語 | PyPy3 (7.3.15) |
結果 |
MLE
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 1,827 bytes |
コンパイル時間 | 238 ms |
コンパイル使用メモリ | 82,320 KB |
実行使用メモリ | 634,580 KB |
最終ジャッジ日時 | 2024-06-01 07:34:06 |
合計ジャッジ時間 | 173,481 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2,368 ms
226,388 KB |
testcase_01 | AC | 2,276 ms
225,324 KB |
testcase_02 | AC | 2,369 ms
436,640 KB |
testcase_03 | MLE | - |
testcase_04 | MLE | - |
testcase_05 | AC | 146 ms
133,608 KB |
testcase_06 | AC | 154 ms
134,484 KB |
testcase_07 | AC | 146 ms
133,880 KB |
testcase_08 | AC | 148 ms
327,832 KB |
testcase_09 | AC | 149 ms
76,416 KB |
testcase_10 | AC | 150 ms
76,476 KB |
testcase_11 | AC | 150 ms
76,260 KB |
testcase_12 | AC | 146 ms
76,192 KB |
testcase_13 | AC | 147 ms
76,432 KB |
testcase_14 | AC | 147 ms
76,376 KB |
testcase_15 | AC | 148 ms
76,796 KB |
testcase_16 | AC | 146 ms
76,248 KB |
testcase_17 | AC | 141 ms
76,212 KB |
testcase_18 | AC | 147 ms
76,148 KB |
testcase_19 | AC | 141 ms
76,204 KB |
testcase_20 | AC | 147 ms
76,368 KB |
testcase_21 | AC | 144 ms
76,116 KB |
testcase_22 | AC | 153 ms
76,536 KB |
testcase_23 | AC | 145 ms
76,192 KB |
testcase_24 | AC | 147 ms
76,396 KB |
testcase_25 | AC | 4,150 ms
198,428 KB |
testcase_26 | AC | 3,692 ms
193,352 KB |
testcase_27 | AC | 69 ms
68,212 KB |
testcase_28 | AC | 3,681 ms
196,820 KB |
evil_60bit1.txt | MLE | - |
evil_60bit2.txt | TLE | - |
evil_60bit3.txt | TLE | - |
evil_hack | AC | 59 ms
60,892 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))