結果

問題 No.950 行列累乗
ユーザー gew1fw
提出日時 2025-06-12 21:42:42
言語 PyPy3
(7.3.15)
結果
WA  
実行時間 -
コード長 1,354 bytes
コンパイル時間 324 ms
コンパイル使用メモリ 81,812 KB
実行使用メモリ 324,936 KB
最終ジャッジ日時 2025-06-12 21:47:59
合計ジャッジ時間 78,420 ms
ジャッジサーバーID
(参考情報)
judge2 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 30 WA * 26 TLE * 1
権限があれば一括ダウンロードができます

ソースコード

diff #

import sys

def readints():
    return list(map(int, sys.stdin.readline().split()))

def mat_mult(a, b, p):
    res = [[0]*2 for _ in range(2)]
    for i in range(2):
        for j in range(2):
            for k in range(2):
                res[i][j] = (res[i][j] + a[i][k] * b[k][j]) % p
    return res

def mat_pow(a, n, p):
    result = [[1 if i == j else 0 for j in range(2)] for i in range(2)]
    while n > 0:
        if n % 2 == 1:
            result = mat_mult(result, a, p)
        a = mat_mult(a, a, p)
        n = n // 2
    return result

def main():
    p = int(sys.stdin.readline())
    A = []
    for _ in range(2):
        A.append(readints())
    B = []
    for _ in range(2):
        B.append(readints())
    
    if A == B:
        print(1)
        return
    
    seen = {}
    current = A.copy()
    n = 1
    seen_key = tuple(current[0] + current[1])
    seen[seen_key] = n
    
    found = False
    while True:
        current = mat_mult(current, A, p)
        n += 1
        current_key = tuple(current[0] + current[1])
        if current_key == tuple(B[0]+B[1]):
            print(n)
            found = True
            break
        if current_key in seen:
            break
        seen[current_key] = n
        if n > 1000000:
            break
    
    if not found:
        print(-1)

if __name__ == "__main__":
    main()
0