結果
| 問題 | 
                            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