結果
| 問題 |
No.526 フィボナッチ数列の第N項をMで割った余りを求める
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-04-22 23:30:38 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 43 ms / 2,000 ms |
| コード長 | 1,486 bytes |
| コンパイル時間 | 361 ms |
| コンパイル使用メモリ | 82,048 KB |
| 実行使用メモリ | 52,352 KB |
| 最終ジャッジ日時 | 2024-11-07 10:29:11 |
| 合計ジャッジ時間 | 1,680 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 12 |
ソースコード
def mat_mul(A, B, m=1):
"""
行列Aと行列Bの乗算を行う関数(numpyを使わないバージョン)
:param A: 行列A (2次元リスト)
:param B: 行列B (2次元リスト)
:return: 行列Aと行列Bの乗算結果 (2次元リスト)
"""
rows_A = len(A)
cols_A = len(A[0])
# rows_B = len(B)
cols_B = len(B[0])
result = [[0 for _ in range(cols_B)] for _ in range(rows_A)]
for i in range(rows_A):
for j in range(cols_B):
for k in range(cols_A):
result[i][j] += A[i][k] * B[k][j]
result[i][j] %= m
return result
def mat_pow(A, n, m=1):
"""
行列Aのn乗を繰り返し二乗法で計算する関数(numpyを使わないバージョン)
:param A: 行列A (2次元リスト)
:param n: べき乗する指数 (整数)
:return: 行列Aのn乗 (2次元リスト)
"""
rows = len(A)
cols = len(A[0])
# 単位行列を生成
identity = [[1 if i == j else 0 for j in range(cols)] for i in range(rows)]
# べき乗が0の場合は単位行列を返す
if n == 0:
return identity
result = identity
power_matrix = A
while n > 0:
if n % 2 == 1:
result = mat_mul(result, power_matrix, m)
power_matrix = mat_mul(power_matrix, power_matrix, m)
n //= 2
return result
N, M = map(int, input().split())
mat = [[1,1],[1,0]]
ret = mat_pow(mat, N-1, M)
print(ret[0][1])