結果
| 問題 |
No.981 一般冪乗根
|
| ユーザー |
toyuzuko
|
| 提出日時 | 2022-04-13 00:07:35 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
MLE
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 1,828 bytes |
| コンパイル時間 | 203 ms |
| コンパイル使用メモリ | 82,832 KB |
| 実行使用メモリ | 904,720 KB |
| 最終ジャッジ日時 | 2024-12-21 12:05:08 |
| 合計ジャッジ時間 | 165,499 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 26 TLE * 10 MLE * 8 |
ソースコード
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))
toyuzuko