BotByte

Matrix Expo

May 3rd, 2018
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.79 KB | None | 0 0
  1. /*
  2.     Author : M. A. Rafsan Mazumder
  3.     *** Matrix Exponentiation ***
  4.     Complexity : O(n^3 * log(n))
  5.     Code : LightOJ 1096 - Finding nth term for -
  6.            f(n) = a*f(n-1) + b*f(n-3) + c , if(n>2)
  7.            f(n) = 0 , if(n<=2)
  8. */
  9.  
  10. #include <bits/stdc++.h>
  11.  
  12. using namespace std;
  13.  
  14. #define dim 4 // dimension of the matrix
  15. #define MOD 10007
  16. #define ll long long
  17. ll n, a, b, c;
  18.  
  19. struct matrix{
  20.     ll M[dim][dim];
  21.  
  22.     // constructor. Make an empty array.
  23.     matrix(){
  24.         memset(M, 0, sizeof M);
  25.     }
  26.  
  27.     // constant matrix (M)
  28.     void unit_matrix(){
  29.         M[0][0] = a, M[0][1] = 0, M[0][2] = b, M[0][3] = 1;
  30.         M[1][0] = 1, M[1][1] = 0, M[1][2] = 0, M[1][3] = 0;
  31.         M[2][0] = 0, M[2][1] = 1, M[2][2] = 0, M[2][3] = 0;
  32.         M[3][0] = 0, M[3][1] = 0, M[3][2] = 0, M[3][3] = 1;
  33.     }
  34.  
  35.     matrix operator* (matrix N){
  36.         matrix mul;
  37.         for(ll i=0; i<dim; i++){
  38.             for(ll j=0; j<dim; j++){
  39.                 for(ll k=0; k<dim; k++){
  40.                     mul.M[i][j] = (mul.M[i][j]%MOD + ((M[i][k]%MOD)*(N.M[k][j]%MOD))%MOD)%MOD;
  41.                 }
  42.             }
  43.         }
  44.         return mul;
  45.     }
  46. };
  47.  
  48. matrix pow_matrix(matrix A, ll p)
  49. {
  50.     if(p == 1) return A;
  51.  
  52.     matrix ret = pow_matrix(A, p/2);
  53.     ret = ret * ret;
  54.     if(1&p) ret = ret * A;
  55.  
  56.     return ret;
  57. }
  58.  
  59. int main()
  60. {
  61.     ll cases;
  62.     scanf("%lld", &cases);
  63.     ll caseno = 0;
  64.     while(cases--){
  65.         scanf("%lld %lld %lld %lld", &n, &a, &b, &c);
  66.         if(n <= 2){
  67.             printf("Case %lld: %lld\n", ++caseno, 0);
  68.             continue;
  69.         }
  70.         matrix t;
  71.         t.unit_matrix();
  72.         t = pow_matrix(t, n-2);
  73.         ll ans = (t.M[0][3]%MOD) * (c%MOD);
  74.         printf("Case %lld: %lld\n", ++caseno, ans%MOD);
  75.     }
  76. }
Advertisement
Add Comment
Please, Sign In to add comment