結果

問題 No.950 行列累乗
ユーザー gew1fw
提出日時 2025-06-12 16:47:13
言語 PyPy3
(7.3.15)
結果
TLE  
実行時間 -
コード長 1,315 bytes
コンパイル時間 148 ms
コンパイル使用メモリ 82,040 KB
実行使用メモリ 181,040 KB
最終ジャッジ日時 2025-06-12 16:48:04
合計ジャッジ時間 7,196 ms
ジャッジサーバーID
(参考情報)
judge3 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample -- * 4
other TLE * 1 -- * 56
権限があれば一括ダウンロードができます

ソースコード

diff #

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

def matrix_pow(a, n, p):
    result = [[1, 0], [0, 1]]
    current = a
    while n > 0:
        if n % 2 == 1:
            result = multiply(result, current, p)
        current = multiply(current, current, p)
        n = n // 2
    return result

def find_min_n(A, B, p):
    visited = dict()
    current = A
    n = 1
    while True:
        current = matrix_pow(A, n, p)
        if current == B:
            return n
        key = tuple(map(tuple, current))
        if key in visited:
            return -1
        visited[key] = n
        n += 1
        if n > p**4:
            return -1

def main():
    import sys
    input = sys.stdin.read().split()
    ptr = 0
    p = int(input[ptr])
    ptr +=1
    A = []
    for _ in range(2):
        row = list(map(int, input[ptr:ptr+2]))
        ptr +=2
        A.append(row)
    B = []
    for _ in range(2):
        row = list(map(int, input[ptr:ptr+2]))
        ptr +=2
        B.append(row)
    min_n = find_min_n(A, B, p)
    print(min_n if min_n != -1 else -1)

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