Advertisement
tien_noob

MulMatrix

Aug 9th, 2021
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.11 KB | None | 0 0
  1. //Make CSP great again
  2. #include <bits/stdc++.h>
  3. #define TASK "TESTCODE"
  4. using namespace std;
  5. using Matrix = vector<vector<int> >;
  6. int n, m;
  7. void ResizeMatrix(Matrix & a)
  8. {
  9.     a.resize(n + 1);
  10.     for (int i = 0; i <= n; ++ i)
  11.     {
  12.         a[i].resize(n + 1, 0);
  13.     }
  14. }
  15. void PrintMatrix(Matrix & a)
  16. {
  17.     for (int i = 1; i <= n; ++ i)
  18.     {
  19.         for (int j = 1; j <= n; ++ j)
  20.         {
  21.             cout << a[i][j] << ' ';
  22.         }
  23.         cout << '\n';
  24.     }
  25. }
  26. Matrix operator + (Matrix & a, Matrix & b)
  27. {
  28.     Matrix c;
  29.     ResizeMatrix(c);
  30.     for (int i = 1; i <= n; ++ i)
  31.     {
  32.         for (int j = 1; j <= n; ++ j)
  33.         {
  34.             c[i][j] = a[i][j] + b[i][j];
  35.             c[i][j] %= 10;
  36.         }
  37.     }
  38.     return c;
  39. }
  40. Matrix operator * (Matrix & a, Matrix & b)
  41. {
  42.     Matrix c;
  43.     ResizeMatrix(c);
  44.     for (int i = 1; i <= n; ++ i)
  45.     {
  46.         for (int j = 1; j <= n; ++ j)
  47.         {
  48.             for (int k = 1; k <= n; ++ k)
  49.             {
  50.                 c[i][j] += a[i][k] * b[k][j];
  51.                 c[i][j] %= 10;
  52.             }
  53.         }
  54.     }
  55.     return c;
  56. }
  57. Matrix operator ^ (Matrix a, int k)
  58. {   --k;
  59.     Matrix c = a;
  60.     for (; k > 0; k /= 2)
  61.     {
  62.         if (k & 1)
  63.         {
  64.             c = c * a;
  65.         }
  66.         a = a * a;
  67.     }
  68.     return c;
  69. }
  70. Matrix G(Matrix a, int k)
  71. {
  72.     if (k == 1)
  73.     {
  74.         return a;
  75.     }
  76.     Matrix c = G(a, k/2);
  77.     Matrix add = a ^ (k/2);
  78.     add = add * c;
  79.     Matrix res = c + add;
  80.     if (k & 1)
  81.     {
  82.         Matrix add2 = a ^ k;
  83.         res = res + add2;
  84.     }
  85.     return res;
  86. }
  87. Matrix a;
  88. void read()
  89. {
  90.     cin >> n >> m;
  91.     ResizeMatrix(a);
  92.     for (int i = 1; i <= n; ++ i)
  93.     {
  94.         for (int j = 1; j <= n; ++ j)
  95.         {
  96.             cin >> a[i][j];
  97.             a[i][j] %= 10;
  98.         }
  99.     }
  100. }
  101. void solve()
  102. {
  103.     a = G(a, m);
  104.     PrintMatrix(a);
  105. }
  106. int main()
  107. {
  108.     ios_base::sync_with_stdio(false);
  109.     cin.tie(nullptr);
  110.     //freopen(TASK".INP", "r", stdin);
  111.     //freopen(TASK".OUT", "w", stdout);
  112.     int t = 1;
  113.     bool typetest = false;
  114.     if (typetest)
  115.     {
  116.         cin >> t;
  117.     }
  118.     for (int __ = 1; __ <= t; ++ __)
  119.     {
  120.         read();
  121.         solve();
  122.     }
  123. }
  124.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement