Advertisement
pdpd123

Untitled

Mar 1st, 2019
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.31 KB | None | 0 0
  1. /// problem 14. 費氏數列問題
  2. /// SF 70%
  3.  
  4. #include<bits/stdc++.h>
  5. #define mp make_pair
  6. #define int long long
  7. #define mod 1000000007
  8. #define endl '\n'
  9. using namespace std;
  10.  
  11. int n,m;
  12.  
  13. struct matrix{
  14.     int v[110][110];
  15.     void operator=(matrix a){
  16.         for(int i=0;i<m;i++)
  17.             for(int j=0;j<m;j++)
  18.                 this->v[i][j]=a.v[i][j];
  19.     }
  20. };
  21.  
  22. matrix mul(matrix a,matrix b){
  23.     matrix ans;
  24.  
  25.     for(int i=0;i<m;i++)
  26.         for(int j=0;j<m;j++){
  27.             ans.v[i][j]=0;
  28.             for(int k=0;k<m;k++)
  29.                 ans.v[i][j]+=((a.v[i][k]%mod)*(b.v[k][j]%mod))%mod;
  30.         }
  31.     return ans;
  32. }
  33.  
  34. matrix pow(matrix a,int p){
  35.     matrix e=a,ans;
  36.  
  37.     for(int i=0;i<m;i++)
  38.         for(int j=0;j<m;j++)
  39.             ans.v[i][j]=(i==j);
  40.  
  41.     while(p){
  42.         if(p&1ll) ans=mul(e,ans);
  43.         p>>=1,e=mul(e,e);
  44.     }
  45.     return ans;
  46. }
  47.  
  48. int k[110];
  49.  
  50. signed main(){
  51.  
  52.     cin >> n >> m;
  53.  
  54.     for(int i=0;i<m;i++)
  55.         cin >> k[i],k[i]%=mod;
  56.  
  57.     matrix a;
  58.  
  59.     for(int i=0;i<m-1;i++)
  60.         for(int j=0;j<m;j++)
  61.             a.v[i][j]=(i==j-1);
  62.     for(int i=0;i<m;i++)
  63.         a.v[m-1][i]=k[m-i-1]%mod;
  64.  
  65.     matrix ans=pow(a,n-m);
  66.  
  67.     int fn=0;
  68.     for(int i=0;i<n;i++)
  69.         fn+=ans.v[m-1][i],fn%=mod;
  70.     cout << fn%mod << endl;
  71.  
  72. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement