結果
問題 | No.194 フィボナッチ数列の理解(1) |
ユーザー | kotatsugame |
提出日時 | 2020-03-11 21:01:41 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 44 ms / 5,000 ms |
コード長 | 1,315 bytes |
コンパイル時間 | 636 ms |
コンパイル使用メモリ | 66,260 KB |
実行使用メモリ | 11,332 KB |
最終ジャッジ日時 | 2024-11-16 00:24:01 |
合計ジャッジ時間 | 3,333 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 37 |
コンパイルメッセージ
main.cpp:36:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type] 36 | main() | ^~~~
ソースコード
#include<iostream>using namespace std;long mod=1e9+7;int N;long K;int A[10101];long F[1<<20];struct Mat{long dat[31][31];};Mat mul(Mat A,Mat B){Mat ret;for(int i=0;i<31;i++)for(int j=0;j<31;j++)ret.dat[i][j]=0;for(int i=0;i<31;i++)for(int j=0;j<31;j++){for(int k=0;k<31;k++)ret.dat[i][j]+=A.dat[i][k]*B.dat[k][j]%mod;ret.dat[i][j]%=mod;}return ret;}Mat pow(Mat A,long k){Mat E;for(int i=0;i<31;i++)for(int j=0;j<31;j++){E.dat[i][j]=i==j?1:0;}while(k){if(k&1)E=mul(E,A);k>>=1;A=mul(A,A);}return E;}main(){cin>>N>>K;for(int i=1;i<=N;i++)cin>>A[i];if(K<1<<20){long sum=0;for(int i=1;i<=N;i++){sum+=F[i]=A[i];}long now=sum;for(int i=N+1;i<=K;i++){F[i]=now%=mod;(sum+=now)%=mod;now=(now+F[i]+mod-F[i-N])%mod;}cout<<F[K]<<" "<<sum<<endl;}else{Mat F,S;for(int i=0;i<31;i++)for(int j=0;j<31;j++){F.dat[i][j]=S.dat[i][j]=0;}F.dat[0][0]=1;for(int i=1;i<N;i++)F.dat[i][i-1]=F.dat[0][i]=1;F=pow(F,K-N);long f=0;for(int i=0;i<N;i++)f+=F.dat[0][i]*A[N-i];cout<<f%mod<<" ";S.dat[0][0]=2;S.dat[0][N]=mod-1;for(int i=0;i<N;i++)S.dat[i+1][i]=1;S=pow(S,K-N);long s=0,t=0;for(int i=N;i>=0;i--){t+=A[N-i];s+=t*S.dat[0][i];}cout<<s%mod<<endl;}}