結果
問題 |
No.747 循環小数N桁目 Hard
|
ユーザー |
![]() |
提出日時 | 2025-06-30 21:49:44 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 46 ms / 2,000 ms |
コード長 | 1,118 bytes |
コンパイル時間 | 581 ms |
コンパイル使用メモリ | 82,240 KB |
実行使用メモリ | 65,808 KB |
最終ジャッジ日時 | 2025-06-30 21:49:54 |
合計ジャッジ時間 | 8,833 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 120 |
ソースコード
def modulo(s: str, m: int) -> int: x = 0 for d in map(int, s): x = (10*x + d) % m return x def floyds_cycle_finding(a0, f) -> tuple[int, int]: """ フロイドの循環検出法 a0 : 初期値 f : 次の値を求める関数 return: tuple[サイクルに入るまでの長さ, サイクルの長さ] """ x = y = a0 while 1: x = f(x) y = f(f(y)) if x == y: break x = a0 head_len = 0 while x != y: x = f(x) y = f(y) head_len += 1 cycle_len = 0 while 1: x = f(x) y = f(f(y)) cycle_len += 1 if x == y: break return head_len, cycle_len def str_powmod(n: str, k: str, mod: int) -> int: a = modulo(n, mod) head_len, cycle_len = floyds_cycle_finding(a, lambda x: x * a % mod) # print(f'{head_len=} {cycle_len=}') if cycle_len == 1: return a b = modulo(k, cycle_len) if b == 0: b = cycle_len return pow(a, b, mod) N = input() K = input() x = str_powmod(N, K, 6) ans = '428571'[x] print(ans)