結果
問題 | No.2993 冪乗乗 mod 冪乗 |
ユーザー | Kude |
提出日時 | 2024-12-18 13:21:42 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 1,299 bytes |
コンパイル時間 | 367 ms |
コンパイル使用メモリ | 82,492 KB |
実行使用メモリ | 191,576 KB |
最終ジャッジ日時 | 2024-12-19 16:23:10 |
合計ジャッジ時間 | 38,635 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | TLE | - |
testcase_01 | AC | 97 ms
94,708 KB |
testcase_02 | AC | 102 ms
94,624 KB |
testcase_03 | AC | 100 ms
94,972 KB |
testcase_04 | AC | 99 ms
94,360 KB |
testcase_05 | AC | 101 ms
94,568 KB |
testcase_06 | AC | 103 ms
94,732 KB |
testcase_07 | AC | 173 ms
95,104 KB |
testcase_08 | AC | 107 ms
94,980 KB |
testcase_09 | AC | 107 ms
94,308 KB |
testcase_10 | AC | 111 ms
95,056 KB |
testcase_11 | AC | 517 ms
95,212 KB |
testcase_12 | AC | 532 ms
94,816 KB |
testcase_13 | AC | 448 ms
95,200 KB |
testcase_14 | AC | 447 ms
95,068 KB |
testcase_15 | AC | 588 ms
95,736 KB |
testcase_16 | AC | 520 ms
94,948 KB |
testcase_17 | AC | 558 ms
95,160 KB |
testcase_18 | AC | 550 ms
95,468 KB |
testcase_19 | AC | 549 ms
95,004 KB |
testcase_20 | AC | 513 ms
95,268 KB |
testcase_21 | AC | 545 ms
95,256 KB |
testcase_22 | AC | 569 ms
95,016 KB |
testcase_23 | AC | 535 ms
95,048 KB |
testcase_24 | AC | 851 ms
95,100 KB |
testcase_25 | AC | 808 ms
95,180 KB |
testcase_26 | AC | 865 ms
95,164 KB |
testcase_27 | AC | 806 ms
95,152 KB |
testcase_28 | AC | 713 ms
95,124 KB |
testcase_29 | AC | 665 ms
95,008 KB |
testcase_30 | AC | 1,455 ms
191,576 KB |
ソースコード
M = 10 ** 6 + 100 primes = [] lpf = [-1] * M phi = [0] * M phi[1] = 1 for i in range(2, M): p = lpf[i] if p == -1: primes.append(i) p = lpf[i] = i phi[i] = i - 1 for q in primes: j = i * q if j >= M: break lpf[j] = q if q == p: phi[j] = phi[i] * p break phi[j] = phi[i] * (q - 1) from math import gcd def solve(b, n, m): if gcd(m, b) != 1: return -1 tmp = phi[b] t = phi[b] while tmp != 1: p = lpf[tmp] e = 0 while tmp % p == 0: tmp //= p e += 1 lb, ub = 0, e + 1 while ub - lb > 1: mid = (ub + lb) // 2 if pow(m, t // p ** mid, b) == 1: lb = mid else: ub = mid t //= p ** lb assert pow(m, t, b) == 1 c = 0 g = b while t != 1: g = gcd(g, t) if g == 1: return -1 t //= g c += 1 c = max(c + 1, n) bcn = b ** (c + n) mbc = m for _ in range(c): mbc = pow(mbc, b, bcn) q, r = divmod(mbc, b ** c) if r != 1: return -1 return q for _ in range(int(input())): b, n, m = map(int, input().split()) print(solve(b, n, m))