結果

問題 No.981 一般冪乗根
ユーザー lam6er
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

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()
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0