ahmrf

Untitled

Nov 6th, 2015
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.40 KB | None | 0 0
  1. #include <bits/stdtr1c++.h>
  2.  
  3. using namespace std;
  4.  
  5. long long MOD = 1000000007;
  6.  
  7. struct Matrix {
  8.     int r, c;
  9.     long long **mat;
  10.  
  11.     Matrix(int _r, int _c) {
  12.         r = _r;
  13.         c = _c;
  14.         mat = new long long*[r];
  15.         for(int i = 0; i < r; i++) {
  16.             mat[i] = new long long[c];
  17.         }
  18.     }
  19.  
  20.     int get_row() { return r; }
  21.     int get_column() { return c; }
  22.  
  23.     Matrix multiply(Matrix A) {
  24.         int col = A.get_column();
  25.         Matrix C(r, col);
  26.         long long sum;
  27.         for(int i = 0; i < r; i++) {
  28.             for(int j = 0; j < col; j++) {
  29.                 sum = 0;
  30.                 for(int k = 0; k < r; k++) {
  31.                     sum += (mat[i][k] * A.mat[k][j]) % MOD;;
  32.                 }
  33.                 C.mat[i][j] = sum; 
  34.             }
  35.         }
  36.         return C;
  37.     }
  38. };
  39.  
  40. Matrix F(Matrix A, int n) {
  41.     if(n == 1) return A;
  42.     if(n % 2 == 0) return F(A.multiply(A), n >> 1);
  43.     return A.multiply(F(A.multiply(A), n >> 1));
  44. }
  45.  
  46. int main() {
  47.     Matrix A(2, 2);
  48.     long long a, b, mod;
  49.     int T, t = 1, n;
  50.     scanf("%d", &T);
  51.     while(T--) {
  52.         scanf("%lld %lld %d %lld", &a, &b, &n, &mod);
  53.         MOD = (int) pow(10, mod);
  54.        
  55.         A.mat[0][0] = 1;
  56.         A.mat[0][1] = 1;
  57.         A.mat[1][0] = b;
  58.         A.mat[1][1] = a;
  59.         printf("Case %d: \n", t++);
  60.         if(n == 0) {
  61.             printf("%lld\n", a);
  62.         } else if(n == 1) {
  63.             printf("%lld\n", b);
  64.         }else {
  65.             Matrix C = F(A, n);
  66.             for(int i = 0; i < C.get_row(); i++) {
  67.                 for(int j = 0; j < C.get_column(); j++) {
  68.                     cout << C.mat[i][j] << ' ';
  69.                 }
  70.                 puts("");
  71.             }
  72.         }
  73.     }
  74.     return 0;
  75. }
Advertisement
Add Comment
Please, Sign In to add comment