結果

問題 No.981 一般冪乗根
ユーザー toyuzuko
提出日時 2022-04-12 23:56:45
言語 PyPy3
(7.3.15)
結果
MLE  
(最新)
AC  
(最初)
実行時間 -
コード長 1,827 bytes
コンパイル時間 423 ms
コンパイル使用メモリ 82,376 KB
実行使用メモリ 1,012,288 KB
最終ジャッジ日時 2024-12-21 11:52:45
合計ジャッジ時間 165,990 ms
ジャッジサーバーID
(参考情報)
judge3 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 26 TLE * 11 MLE * 7
権限があれば一括ダウンロードができます

ソースコード

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

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