結果
| 問題 |
No.981 一般冪乗根
|
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 21:21:17 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,287 bytes |
| コンパイル時間 | 151 ms |
| コンパイル使用メモリ | 81,832 KB |
| 実行使用メモリ | 75,648 KB |
| 最終ジャッジ日時 | 2025-06-12 21:23:22 |
| 合計ジャッジ時間 | 42,990 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 7 WA * 37 |
ソースコード
import sys
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 modinv(a, m):
g, x, y = extended_gcd(a, m)
if g != 1:
return None
else:
return x % m
def pow_mod(a, b, mod):
result = 1
a = a % mod
while b > 0:
if b % 2 == 1:
result = (result * a) % mod
a = (a * a) % mod
b = b // 2
return result
def tonelli_shanks(n, p):
if n == 0:
return 0
if p == 2:
return p
if pow_mod(n, (p - 1) // 2, p) != 1:
return None
if p % 4 == 3:
x = pow_mod(n, (p + 1) // 4, p)
return x
q = p - 1
s = 0
while q % 2 == 0:
q = q // 2
s += 1
for z in range(2, p):
if pow_mod(z, q, p) != 1:
break
c = pow_mod(z, q, p)
x = pow_mod(n, (q + 1) // 2, p)
t = pow_mod(n, q, p)
m = s
while t != 1:
i, temp = 0, t
while temp != 1 and i < m:
temp = pow_mod(temp, 2, p)
i += 1
if i == m:
return None
b = pow_mod(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_odd_root(b, s, p):
g = gcd(s, p - 1)
m = (p - 1) // g
u = modinv(s, m)
if u is None:
return -1
x = pow_mod(b, u, p)
return x
def gcd(a, b):
while b:
a, b = b, a % b
return a
def solve(p, k, a):
if a == 1:
return 1
if a == 0:
return 0
d = gcd(k, p - 1)
e = (p - 1) // d
if pow_mod(a, e, p) != 1:
return -1
k_prime = k // d
m = e
u = modinv(k_prime, m)
if u is None:
return -1
b = pow_mod(a, u, p)
s = d
e = 0
while s % 2 == 0:
s = s // 2
e += 1
x = solve_odd_root(b, s, p)
if x == -1:
return -1
for _ in range(e):
x = tonelli_shanks(x, p)
if x is None:
return -1
return x
def main():
T = int(sys.stdin.readline())
for _ in range(T):
p, k, a = map(int, sys.stdin.readline().split())
res = solve(p, k, a)
print(res)
if __name__ == "__main__":
main()
gew1fw