結果
問題 | 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 sysimport mathdef input():return sys.stdin.read()def modinv(a, m):g, x, y = extended_gcd(a, m)if g != 1:return Noneelse:return x % mdef 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 -1if n == 0:return 0Q = p - 1S = 0while Q % 2 == 0:Q //= 2S += 1z = 2while pow(z, (p - 1) // 2, p) != p - 1:z += 1c = pow(z, Q, p)x = pow(n, (Q + 1) // 2, p)t = pow(n, Q, p)m = Swhile t != 1:tmp = ti = 0while tmp != 1 and i < m:tmp = pow(tmp, 2, p)i += 1if i == m:return -1b = pow(c, 1 << (m - i - 1), p)x = (x * b) % pt = (t * b * b) % pc = (b * b) % pm = ireturn xdef solve():data = input().split()idx = 0T = int(data[idx])idx += 1for _ in range(T):p = int(data[idx])k = int(data[idx+1])a = int(data[idx+2])idx +=3if a == 0:print(0)continued = math.gcd(k, p-1)m = (p-1) // dif pow(a, m, p) != 1:print(-1)continuek_prime = k // dm_val = m # (p-1)/dinv_k_prime = modinv(k_prime, m_val)if inv_k_prime is None:print(-1)continueb = pow(a, inv_k_prime, p)found = Falseif d == 1:print(b % p)continueelif d == 2:x = tonelli_shanks(b, p)if x == -1:print(-1)else:print(x % p)continueelse:for x in range(p):if pow(x, d, p) == b % p:print(x)found = Truebreakif not found:print(-1)if __name__ == "__main__":solve()