Advertisement
a53

pavare2

a53
Mar 31st, 2019
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.14 KB | None | 0 0
  1. #include <iostream>
  2. #define KMAX 30
  3. #define MOD 1000000007
  4. int k,n;
  5. int64_t dp[KMAX]={1,1,2,4};
  6. struct Matrix
  7. {
  8. int64_t mat[KMAX][KMAX]={};
  9. inline int64_t* operator[](int ind)
  10. {
  11. return mat[ind];
  12. }
  13. };
  14.  
  15. Matrix nullMat;
  16. Matrix initMat;
  17.  
  18. Matrix operator*(Matrix a,Matrix b)
  19. {
  20. Matrix prod;
  21. for(int i=0;i<k;++i)
  22. for(int j=0;j<k;++j)
  23. for(int l=0;l<k;++l)
  24. prod[i][j]=(prod[i][j]+a[i][l]*b[l][j]%MOD)%MOD;
  25. return prod;
  26. }
  27.  
  28. Matrix pow(Matrix mat,int n)
  29. {
  30. if(!n)
  31. return nullMat;
  32. if(n&1)
  33. return mat*pow(mat*mat,n>>1);
  34. return pow(mat*mat,n>>1);
  35. }
  36.  
  37. int main()
  38. {
  39. std::cin>>k>>n;
  40. for(int i=0;i<(k>3?k:3);++i)
  41. nullMat[i][i]=1;
  42. if (k==1)
  43. {
  44. if(n==1) {std::cout<<"1\n";return 0;}
  45. if(n==2) {std::cout<<"2\n";return 0;}
  46. dp[0]=1;
  47. dp[1]=1;
  48. dp[2]=2;
  49. k=3;
  50. initMat[0][0]=1;
  51. initMat[1][0]=1;
  52. initMat[2][0]=1;
  53. initMat[0][1]=1;
  54. initMat[1][2]=1;
  55. int64_t sol=0;
  56. Matrix pwr=pow(initMat,n-2);
  57. for(int i=0;i<k;++i)
  58. sol=(sol+dp[k-i-1]*pwr[i][0]%MOD)%MOD;
  59. std::cout<<sol<<'\n';
  60. return 0;
  61. }
  62. if (k==2)
  63. {
  64. if(n==2)
  65. {
  66. std::cout<<"3\n";
  67. return 0;
  68. }
  69. dp[0]=1;
  70. dp[1]=1;
  71. dp[2]=3;
  72. k=3;
  73. initMat[0][0]=1;
  74. initMat[1][0]=2;
  75. initMat[2][0]=1;
  76. initMat[0][1]=1;
  77. initMat[1][2]=1;
  78. int64_t sol=0;
  79. Matrix pwr=pow(initMat,n-2);
  80. for(int i=0;i<k;++i)
  81. sol=(sol+dp[k-i-1]*pwr[i][0]%MOD)%MOD;
  82. std::cout<<sol<<'\n';
  83. return 0;
  84. }
  85. for(int i=4;i<=k;++i)
  86. dp[i]=(dp[i-1]+dp[i-2]+dp[i-3])%MOD;
  87. for(int i=1;i<k;++i)
  88. initMat[i-1][i]=1;
  89. initMat[0][0]=1;
  90. initMat[1][0]=1;
  91. initMat[2][0]=1;
  92. initMat[k-1][0]=dp[k];
  93. int64_t sol=0;
  94. Matrix pwr=pow(initMat,n-k+1);
  95. for(int i=0;i<k;++i)
  96. sol=(sol+dp[k-i-1]*pwr[i][0]%MOD)%MOD;
  97. std::cout<<sol<<'\n';
  98. return 0;
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement