結果
| 問題 |
No.526 フィボナッチ数列の第N項をMで割った余りを求める
|
| コンテスト | |
| ユーザー |
harogen_cube
|
| 提出日時 | 2021-08-18 21:36:32 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 2,000 ms |
| コード長 | 986 bytes |
| コンパイル時間 | 1,810 ms |
| コンパイル使用メモリ | 193,652 KB |
| 最終ジャッジ日時 | 2025-01-23 22:57:15 |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 12 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
long mod;
struct Matrix {
int sz;
long x[2][2];
};
Matrix multiply_matrix(Matrix A, Matrix B){
Matrix C;
C.sz = A.sz;
for(int i = 0 ; i < C.sz; i++){
fill(C.x[i],C.x[i]+C.sz,0);
}
for(int i = 0 ; i < A.sz ; i++){
for(int j = 0 ; j < B.sz ; j++){
for(int k = 0 ; k < A.sz ; k++){
C.x[i][j] += A.x[i][k] * B.x[k][j];
C.x[i][j] %= mod;
}
}
}
return C;
}
int main(){
long n;
cin >> n;
n-=2;
cin >> mod;
Matrix ANS;
ANS.sz = 2;
ANS.x[0][0] = 1; ANS.x[0][1] = 0;
ANS.x[1][0] = 0; ANS.x[1][1] = 1;
Matrix A;
A.sz = 2;
A.x[0][0] = 0; A.x[0][1] = 1;
A.x[1][0] = 1; A.x[1][1] = 1;
for(int i = 0 ; i < 63 ; i++){
if((n & (1LL << i)) > 0LL){
ANS = multiply_matrix(ANS,A);
}
A = multiply_matrix(A,A);
}
cout << ANS.x[1][1] << endl;
}
harogen_cube