結果
| 問題 |
No.718 行列のできるフィボナッチ数列道場 (1)
|
| コンテスト | |
| ユーザー |
peroon
|
| 提出日時 | 2019-04-25 08:30:37 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 2,000 ms |
| コード長 | 1,168 bytes |
| コンパイル時間 | 1,782 ms |
| コンパイル使用メモリ | 174,616 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-11-17 14:59:04 |
| 合計ジャッジ時間 | 2,489 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 20 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using VV = vector<vector<ll> >;
#define FOR(i,a,b) for(ll i=(a);i<(b);++i)
#define ALL(v) (v).begin(), (v).end()
#define p(s) cout<<(s)<<endl
#define p2(s, t) cout << (s) << " " << (t) << endl
#define br() p("")
#define pn(s) cout << (#s) << " " << (s) << endl
#define p_yes() p("Yes")
#define p_no() p("No")
const ll mod = 1e9 + 7;
const ll inf = 1e18;
VV mul(VV A, VV B){
VV C = {{0, 0}, {0, 0}};
C[0][0] = (A[0][0] * B[0][0] + A[0][1] * B[1][0]) % mod;
C[0][1] = (A[0][0] * B[0][1] + A[0][1] * B[1][1]) % mod;
C[1][0] = (A[1][0] * B[0][0] + A[1][1] * B[1][0]) % mod;
C[1][1] = (A[1][0] * B[0][1] + A[1][1] * B[1][1]) % mod;
return C;
}
VV pow(VV A, ll N){
if(N==1){
return A;
}
if(N%2==0){
return pow(mul(A, A), N/2);
}
else{
return mul(A, pow(A, N-1));
}
}
int main(){
cin.tie(0);
ios::sync_with_stdio(false);
// input
ll N;
cin >> N;
// -std=c++11
VV U = {{1,1},{1,0}};
VV A = pow(U, N);
ll F_n_1 = A[0][0];
ll F_n = A[0][1];
p(F_n_1 * F_n % mod);
return 0;
}
peroon