結果
問題 | No.526 フィボナッチ数列の第N項をMで割った余りを求める |
ユーザー |
|
提出日時 | 2025-01-11 00:59:08 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,560 bytes |
コンパイル時間 | 4,975 ms |
コンパイル使用メモリ | 281,052 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2025-01-11 00:59:15 |
合計ジャッジ時間 | 3,992 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | WA * 3 |
other | AC * 1 WA * 11 |
ソースコード
#include <bits/stdc++.h> using namespace std; // 行列の積を計算する関数 vector<vector<long long>> matrixMultiply(const vector<vector<long long>>& a, const vector<vector<long long>>& b, long long m) { int size = a.size(); vector<vector<long long>> result(size, vector<long long>(size, 0)); for (int i = 0; i < size; ++i) { for (int j = 0; j < size; ++j) { for (int k = 0; k < size; ++k) { result[i][j] = (result[i][j] + (a[i][k] * b[k][j]) % m) % m; } } } return result; } // 行列のべき乗を計算する関数(繰り返し二乗法) vector<vector<long long>> matrixPower(vector<vector<long long>> base, long long n, long long m) { int size = base.size(); vector<vector<long long>> result(size, vector<long long>(size)); for(int i=0; i < size; i++){ result[i][i] = 1; } while (n > 0) { if (n & 1) { // nが奇数の場合 result = matrixMultiply(result, base, m); } base = matrixMultiply(base, base, m); n >>= 1; // n を 2 で割る } return result; } int main() { long long n, m; cin >> n >> m; if (n == 0) { cout << 0 << endl; return 0; } if(n == 1) { cout << 1 << endl; return 0; } // 行列 A を定義 vector<vector<long long>> base = {{1, 1}, {1, 0}}; // A の n-1 乗を計算 vector<vector<long long>> result_matrix = matrixPower(base, n - 1, m); // F(n) を計算 long long fib_n = result_matrix[0][0]; cout << fib_n << endl; return 0; }