Advertisement
nicuvlad76

Untitled

Jan 21st, 2021
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.26 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. const int64_t MOD = 1000000007LL;
  5. inline int64_t prod(int64_t u,int64_t v){return u*v%MOD;}
  6. inline int64_t suma(int64_t u,int64_t v){return (u+v)%MOD;}
  7. struct matr
  8. {
  9. int dim;
  10. vector<vector<int64_t>> a;
  11. matr(){dim=1;a=vector<vector<int64_t>>(1,vector<int64_t>(1,0));}
  12. matr(int dim_){dim=dim_;a=vector<vector<int64_t>>(dim,vector<int64_t>(dim,0));}
  13. };
  14. matr operator*(matr A,matr B)
  15. {
  16. int nr=A.dim;
  17. matr C(nr);
  18.  
  19. for(int i=0;i<nr;i++)
  20. for(int j=0;j<nr;j++)
  21. for(int k=0;k<nr;k++)
  22. C.a[i][j]=suma(C.a[i][j],prod(A.a[i][k],B.a[k][j]));
  23. return C;
  24.  
  25. }
  26. matr operator<<(matr A,int e)
  27. {
  28. matr R;
  29. if(e==0)
  30. {
  31. R=matr(A.dim);
  32. for(int i=0;i<A.dim;i++)
  33. R.a[i][i]=1;
  34. return R;
  35. }
  36. R=A<<(e/2);
  37. R=R*R;
  38. if(e%2)R=A*R;
  39. return R;
  40. }
  41. int64_t n,k,x[30];
  42. int main()
  43. {
  44. cin>>k>>n;
  45. x[0]=x[1]=1;x[2]=2;
  46. for(int i=3;i<=k;i++)x[i]=suma(x[i-1],suma(x[i-2],x[i-3]));
  47.  
  48. int64_t sz=max(3,(int)k);
  49. matr P=matr(sz);
  50. P.a[0][0]=1;P.a[0][1]=1;P.a[0][2]=1;P.a[0][k-1]=x[k];
  51. for(int i=1;i<sz;i++)
  52. P.a[i][i-1]=1;
  53. matr Q=P<<n;
  54. cout<<Q.a[0][0];
  55. return 0;
  56. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement