結果
| 問題 |
No.747 循環小数N桁目 Hard
|
| コンテスト | |
| ユーザー |
norioc
|
| 提出日時 | 2025-06-30 21:52:50 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 50 ms / 2,000 ms |
| コード長 | 1,119 bytes |
| コンパイル時間 | 300 ms |
| コンパイル使用メモリ | 82,788 KB |
| 実行使用メモリ | 64,744 KB |
| 最終ジャッジ日時 | 2025-06-30 21:53:00 |
| 合計ジャッジ時間 | 9,233 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / 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)
assert head_len == 0
if cycle_len == 1:
return a
b = modulo(k, cycle_len)
if b == 0:
return pow(a, cycle_len, mod)
return pow(a, b, mod)
N = input()
K = input()
x = str_powmod(N, K, 6)
ans = '428571'[x]
print(ans)
norioc