結果
問題 |
No.526 フィボナッチ数列の第N項をMで割った余りを求める
|
ユーザー |
|
提出日時 | 2025-03-30 20:36:40 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 2 ms / 2,000 ms |
コード長 | 1,691 bytes |
コンパイル時間 | 2,415 ms |
コンパイル使用メモリ | 209,076 KB |
実行使用メモリ | 7,324 KB |
最終ジャッジ日時 | 2025-03-30 20:36:44 |
合計ジャッジ時間 | 3,621 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 12 |
ソースコード
#include <bits/stdc++.h> #define LOOP(n) for (int _i = 0; _i < (n); _i++) #define REP(i, n) for (int i = 0; i < (n); ++i) #define RREP(i, n) for (int i = (n); i >= 0; --i) #define FOR(i, r, n) for (int i = (r); i < (n); ++i) #define ALL(obj) begin(obj), end(obj) #define yes "Yes" #define no "No" using namespace std; typedef long long ll; typedef pair<int,int> pii; typedef pair<ll,ll> pll; typedef pair<ll,int> pli; typedef pair<int,ll> pil; typedef vector<vector<int>> vvi; typedef vector<vector<ll>> vvl; const vector<char> alpha = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; int dx[4] = {0, 1, 0, -1}; int dy[4] = {1, 0, -1, 0}; const ll INF = 1000000007; const ll MOD = 998244353; #define mpair(a,b) make_pair((a),(b)) template<typename T> inline bool chmax(T &a, T b) { return ((a < b) ? (a = b, true) : (false)); } template<typename T> inline bool chmin(T &a, T b) { return ((a > b) ? (a = b, true) : (false)); } ll N,M; vector<vvl> memo(33); vvl matmul(vvl A, vvl B) { vvl res(2, vector<ll>(2, 0)); REP(i,2) { REP(j,2) { REP(k,2) { res[i][j] = (res[i][j] + A[i][k] * B[k][j]) % M; } } } return res; } int main(){ cin >> N >> M; memo[0]={{1,1},{1,0}}; if (N==1) { cout << 1 << endl; return 0; } REP(i,31){ memo[i+1]=matmul(memo[i],memo[i]); } N--; vvl res; bool first=true; REP(i,32){ if (1LL<<i & N){ if (first) res=memo[i],first=false; else { res=matmul(res,memo[i]); } } } cout << res[0][1]%M << endl; }