結果
問題 | No.718 行列のできるフィボナッチ数列道場 (1) |
ユーザー | 01 159 Romy |
提出日時 | 2024-11-29 11:42:40 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 2 ms / 2,000 ms |
コード長 | 2,118 bytes |
コンパイル時間 | 2,380 ms |
コンパイル使用メモリ | 204,188 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-11-29 11:42:44 |
合計ジャッジ時間 | 3,537 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 2 ms
5,248 KB |
testcase_02 | AC | 2 ms
5,248 KB |
testcase_03 | AC | 2 ms
5,248 KB |
testcase_04 | AC | 2 ms
5,248 KB |
testcase_05 | AC | 2 ms
5,248 KB |
testcase_06 | AC | 2 ms
5,248 KB |
testcase_07 | AC | 2 ms
5,248 KB |
testcase_08 | AC | 2 ms
5,248 KB |
testcase_09 | AC | 2 ms
5,248 KB |
testcase_10 | AC | 2 ms
5,248 KB |
testcase_11 | AC | 2 ms
5,248 KB |
testcase_12 | AC | 2 ms
5,248 KB |
testcase_13 | AC | 2 ms
5,248 KB |
testcase_14 | AC | 2 ms
5,248 KB |
testcase_15 | AC | 2 ms
5,248 KB |
testcase_16 | AC | 2 ms
5,248 KB |
testcase_17 | AC | 2 ms
5,248 KB |
testcase_18 | AC | 2 ms
5,248 KB |
testcase_19 | AC | 2 ms
5,248 KB |
testcase_20 | AC | 2 ms
5,248 KB |
testcase_21 | AC | 2 ms
5,248 KB |
testcase_22 | AC | 2 ms
5,248 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for(int i = a; i < (b); ++i) #define per(i, a, b) for(int i = a; i > (b); --i) #define ar array #define sz(x) (int) (x).size() #define pii pair<int,int> #define fi first #define se second typedef long long ll; typedef pair<ll,ll> pll; typedef pair<double,double> pdd; typedef pair<double,int> pdi; typedef vector<int> vi; #define all(x) (x).begin(), (x).end() template<typename T> void min_self(T& A, T B) { A = min(A,B); } template<typename T> void max_self(T& A, T B) { A = max(A,B); } const int mxn=1e5; ll n; const ll mod = 1e9+7; // faster if const template<class T, int N> struct Matrix { typedef Matrix M; array<array<T, N>, N> d{}; M operator*(const M& m) const { M a; rep(i,0,N) rep(j,0,N) rep(k,0,N) a.d[i][j] = (a.d[i][j] + d[i][k]*m.d[k][j]%mod)%mod; return a; } vector<T> operator*(const vector<T>& vec) const { vector<T> ret(N); rep(i,0,N) rep(j,0,N) ret[i] = (ret[i] + d[i][j] * vec[j]%mod)%mod; return ret; } M operator^(ll p) const { assert(p >= 0); M a, b(*this); rep(i,0,N) a.d[i][i] = 1; while (p) { if (p&1) a = a*b; b = b*b; p >>= 1; } return a; } }; void solve() { // vector<ll> fibo(10); // fibo[0] = 0, fibo[1] = 1; // rep(i,2,10) { // fibo[i] = fibo[i-1]+fibo[i-2]; // } // vector<ll> seq(10); // ll pr = 0; // rep(i,0,10) { // pr = (pr + fibo[i]*fibo[i])%mod; // seq[i] = pr; // cout <<seq[i] <<endl; // } // auto linrec = berlekampMassey(seq); // rep(i,0,sz(linrec)) { // cout <<linrec[i] <<","; // } cin >>n; ll n1 = mod-1; Matrix<ll,3> mat; mat.d = {{ {{2,2,n1}},{{1,0,0}} ,{{0,1,0}} }}; vector<ll> v = {2,1,0}; if(n<3) { cout <<v[2-n] <<"\n"; return; } v = (mat^(n-2)) * v; cout <<v[0] <<"\n"; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); solve(); }