結果
| 問題 |
No.181 A↑↑N mod M
|
| コンテスト | |
| ユーザー |
(ΦωΦ)
|
| 提出日時 | 2015-04-13 14:06:48 |
| 言語 | Python2 (2.7.18) |
| 結果 |
AC
|
| 実行時間 | 12 ms / 5,000 ms |
| コード長 | 1,430 bytes |
| コンパイル時間 | 363 ms |
| コンパイル使用メモリ | 6,912 KB |
| 実行使用メモリ | 6,400 KB |
| 最終ジャッジ日時 | 2024-11-24 03:22:37 |
| 合計ジャッジ時間 | 1,936 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 6 |
| other | AC * 37 |
ソースコード
#!/usr/bin/python
def mod_pow(a, b, m):
res = 1
while b > 0:
if b & 1:
res = (res * a) % m
a = (a * a) % m
b >>= 1
return res
M_MAX = 2010
from itertools import count
class Hyper4mod(object):
def __init__(self, a, b, m):
self.a = a
self.b = b
self.m = m
def _cycle(self, a, m):
memo = [-1] * M_MAX
x = mod_pow(a, M_MAX, m)
for i in count(1):
j = memo[x]
if j >= 0:
return i - j
memo[x] = i
x = x * a % m
def _nya(self, a, b, m):
if m == 1:
return 0
if b == 0:
return 1
if b - 1 <= self.bmax:
return mod_pow(a, self.arr[b-1], m)
c = self._cycle(a, m)
return mod_pow(a, M_MAX + (self._nya(a, b-1, c) - M_MAX) % c, m)
def solve(self):
if self.a == 1:
return 1 % self.m
self.arr = [1]
for i in count(1):
nuke = 0
x = 1
exp = self.arr[i-1]
for j in xrange(exp):
x *= self.a
if x >= M_MAX:
nuke = 1
break
if nuke:
break
self.arr.append(x)
self.bmax = len(self.arr) - 1
return self._nya(self.a, self.b, self.m)
print Hyper4mod(*map(int, raw_input().split())).solve()
(ΦωΦ)