結果
問題 |
No.981 一般冪乗根
|
ユーザー |
![]() |
提出日時 | 2025-03-26 15:52:48 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,154 bytes |
コンパイル時間 | 290 ms |
コンパイル使用メモリ | 82,092 KB |
実行使用メモリ | 67,036 KB |
最終ジャッジ日時 | 2025-03-26 15:53:32 |
合計ジャッジ時間 | 15,639 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | TLE * 1 -- * 43 |
ソースコード
import sys import math def input(): return sys.stdin.read() def modinv(a, m): g, x, y = extended_gcd(a, m) if g != 1: return None else: return x % m def extended_gcd(a, b): if a == 0: return (b, 0, 1) else: g, y, x = extended_gcd(b % a, a) return (g, x - (b // a) * y, y) def tonelli_shanks(n, p): if pow(n, (p - 1) // 2, p) != 1: return -1 if n == 0: return 0 Q = p - 1 S = 0 while Q % 2 == 0: Q //= 2 S += 1 z = 2 while pow(z, (p - 1) // 2, p) != p - 1: z += 1 c = pow(z, Q, p) x = pow(n, (Q + 1) // 2, p) t = pow(n, Q, p) m = S while t != 1: tmp = t i = 0 while tmp != 1 and i < m: tmp = pow(tmp, 2, p) i += 1 if i == m: return -1 b = pow(c, 1 << (m - i - 1), p) x = (x * b) % p t = (t * b * b) % p c = (b * b) % p m = i return x def solve(): data = input().split() idx = 0 T = int(data[idx]) idx += 1 for _ in range(T): p = int(data[idx]) k = int(data[idx+1]) a = int(data[idx+2]) idx +=3 if a == 0: print(0) continue d = math.gcd(k, p-1) m = (p-1) // d if pow(a, m, p) != 1: print(-1) continue k_prime = k // d m_val = m # (p-1)/d inv_k_prime = modinv(k_prime, m_val) if inv_k_prime is None: print(-1) continue b = pow(a, inv_k_prime, p) found = False if d == 1: print(b % p) continue elif d == 2: x = tonelli_shanks(b, p) if x == -1: print(-1) else: print(x % p) continue else: for x in range(p): if pow(x, d, p) == b % p: print(x) found = True break if not found: print(-1) if __name__ == "__main__": solve()