結果
| 問題 |
No.950 行列累乗
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 21:38:06 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,315 bytes |
| コンパイル時間 | 181 ms |
| コンパイル使用メモリ | 82,524 KB |
| 実行使用メモリ | 162,744 KB |
| 最終ジャッジ日時 | 2025-06-12 21:41:44 |
| 合計ジャッジ時間 | 6,908 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | -- * 4 |
| other | TLE * 1 -- * 56 |
ソースコード
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()
gew1fw