ahmrf

Untitled

Nov 6th, 2015
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.52 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 B(2, 1);
  41.  
  42. Matrix F(Matrix A, int n) {
  43.     if(n == 1) return A;
  44.     if(n % 2 == 0) return F(A.multiply(A), n >> 1);
  45.     return A.multiply(F(A.multiply(A), n >> 1));
  46. }
  47.  
  48. int main() {
  49.     Matrix A(2, 2);
  50.     long long a, b, mod;
  51.     long long mat[2][2] = {{1, 1}, {1, 0}};
  52.     for(int i = 0; i < 2; i++)
  53.         for(int j = 0; j < 2; j++)
  54.             A.mat[i][j] = mat[i][j];
  55.     int T, t = 1, n;
  56.     scanf("%d", &T);
  57.     while(T--) {
  58.         scanf("%lld %lld %d %lld", &a, &b, &n, &mod);
  59.         MOD = (int) pow(10, mod);
  60.        
  61.         B.mat[0][0] = b;
  62.         B.mat[1][0] = a;
  63.         printf("Case %d: \n", t++);
  64.         if(n == 0) {
  65.             printf("%lld\n", a);
  66.         } else if(n == 1) {
  67.             printf("%lld\n", b);
  68.         }else {
  69.             Matrix C = B.multiply(F(A, n - 1));
  70.             for(int i = 0; i < C.get_row(); i++) {
  71.                 for(int j = 0; j < C.get_column(); j++) {
  72.                     cout << C.mat[i][j] << ' ';
  73.                 }
  74.                 puts("");
  75.             }
  76.         }
  77.     }
  78.     return 0;
  79. }
Advertisement
Add Comment
Please, Sign In to add comment