結果
| 問題 | No.526 フィボナッチ数列の第N項をMで割った余りを求める |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-05-22 00:37:31 |
| 言語 | Rust (1.94.0 + proconio + num + itertools) |
| 結果 |
AC
|
| 実行時間 | 1 ms / 2,000 ms |
| コード長 | 1,212 bytes |
| 記録 | |
| コンパイル時間 | 12,231 ms |
| コンパイル使用メモリ | 189,164 KB |
| 実行使用メモリ | 6,400 KB |
| 最終ジャッジ日時 | 2026-05-22 00:37:54 |
| 合計ジャッジ時間 | 13,752 ms |
|
ジャッジサーバーID (参考情報) |
judge2_1 / judge3_0 |
| 純コード判定待ち |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 12 |
ソースコード
use proconio::input;
// yukicoder No.526
// Q. Remainder of Nth Fibonacci number modulo M
// A. Matrix exponentiation: 行列累積乗
fn main() {
input!{n: usize, m: usize}
let base_matrix: [[usize; 2]; 2] = [[1, 1], [1, 0]];
let result_matrix: [[usize; 2]; 2] = matrix_pow(base_matrix, n, m);
println!("{}", result_matrix[1][1] % m);
}
fn matrix_pow(matrix: [[usize; 2]; 2], mut exponent: usize, modulus: usize) -> [[usize; 2]; 2] {
let mut result: [[usize; 2]; 2] = [[1, 0], [0, 1]];
let mut base: [[usize; 2]; 2] = matrix;
while exponent > 0 {
if exponent % 2 == 1 {
result = matrix_mult(result, base, modulus);
}
base = matrix_mult(base, base, modulus);
exponent /= 2;
}
return result;
}
fn matrix_mult(mat1: [[usize; 2]; 2], mat2: [[usize; 2]; 2], modulus: usize) -> [[usize; 2]; 2] {
let mut result: [[usize; 2]; 2] = [[0; 2]; 2];
for i in 0..2 {
for j in 0..2 {
for k in 0..2 {
let prod = (mat1[i][k] as u128) * (mat2[k][j] as u128);
result[i][j] = ((result[i][j] as u128 + prod) % (modulus as u128)) as usize;
}
}
}
return result;
}