結果
問題 |
No.181 A↑↑N mod M
|
ユーザー |
![]() |
提出日時 | 2025-04-16 15:36:05 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 39 ms / 5,000 ms |
コード長 | 1,582 bytes |
コンパイル時間 | 259 ms |
コンパイル使用メモリ | 82,124 KB |
実行使用メモリ | 54,052 KB |
最終ジャッジ日時 | 2025-04-16 15:40:38 |
合計ジャッジ時間 | 3,156 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
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()