結果
| 問題 |
No.181 A↑↑N mod M
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 2025-04-15 21:45:12 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 39 ms / 5,000 ms |
| コード長 | 1,582 bytes |
| コンパイル時間 | 340 ms |
| コンパイル使用メモリ | 82,372 KB |
| 実行使用メモリ | 54,160 KB |
| 最終ジャッジ日時 | 2025-04-15 21:46:04 |
| 合計ジャッジ時間 | 2,991 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 6 |
| other | AC * 37 |
ソースコード
import sys
sys.setrecursionlimit(10000)
def totient(n):
if n == 0:
return 0
res = n
i = 2
while i * i <= n:
if n % i == 0:
while n % i == 0:
n //= i
res -= res // i
i += 1
if n > 1:
res -= res // n
return res
def is_ge(a, n, x):
if x == 0:
return True
if n == 0:
return 1 >= x
if n == 1:
return a >= x
if a == 1:
return 1 >= x
import math
if x == 1:
return True
try:
log_val = math.log(x) / math.log(a)
except:
return False
required = math.ceil(log_val)
return is_ge(a, n-1, required)
memo = {}
def mod_tet(a, n, m):
key = (a, n, m)
if key in memo:
return memo[key]
if m == 1:
memo[key] = 0
return 0
if n == 0:
res = 1 % m
memo[key] = res
return res
if a == 1:
res = 1 % m
memo[key] = res
return res
if n == 1:
res = a % m
memo[key] = res
return res
phi_m = totient(m)
e_mod = mod_tet(a, n-1, phi_m)
e_ge = is_ge(a, n-1, phi_m)
if e_ge:
exponent = e_mod + phi_m
else:
exponent = e_mod
res = pow(a, exponent, m)
memo[key] = res
return res
def main():
A, N, M = map(int, sys.stdin.readline().split())
if M == 1:
print(0)
return
if N == 0:
print(1 % M)
return
if A == 1:
print(1 % M)
return
print(mod_tet(A, N, M))
if __name__ == '__main__':
main()
lam6er