Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /// problem 14. 費氏數列問題
- /// SF 70%
- #include<bits/stdc++.h>
- #define mp make_pair
- #define int long long
- #define mod 1000000007
- #define endl '\n'
- using namespace std;
- int n,m;
- struct matrix{
- int v[110][110];
- void operator=(matrix a){
- for(int i=0;i<m;i++)
- for(int j=0;j<m;j++)
- this->v[i][j]=a.v[i][j];
- }
- };
- matrix mul(matrix a,matrix b){
- matrix ans;
- for(int i=0;i<m;i++)
- for(int j=0;j<m;j++){
- ans.v[i][j]=0;
- for(int k=0;k<m;k++)
- ans.v[i][j]+=((a.v[i][k]%mod)*(b.v[k][j]%mod))%mod;
- }
- return ans;
- }
- matrix pow(matrix a,int p){
- matrix e=a,ans;
- for(int i=0;i<m;i++)
- for(int j=0;j<m;j++)
- ans.v[i][j]=(i==j);
- while(p){
- if(p&1ll) ans=mul(e,ans);
- p>>=1,e=mul(e,e);
- }
- return ans;
- }
- int k[110];
- signed main(){
- cin >> n >> m;
- for(int i=0;i<m;i++)
- cin >> k[i],k[i]%=mod;
- matrix a;
- for(int i=0;i<m-1;i++)
- for(int j=0;j<m;j++)
- a.v[i][j]=(i==j-1);
- for(int i=0;i<m;i++)
- a.v[m-1][i]=k[m-i-1]%mod;
- matrix ans=pow(a,n-m);
- int fn=0;
- for(int i=0;i<n;i++)
- fn+=ans.v[m-1][i],fn%=mod;
- cout << fn%mod << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement