fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define maxn 25
  5. #define mod 10
  6. ll n, k;
  7. struct matran_con
  8. {
  9. ll a[maxn][maxn];
  10. void print()
  11. {
  12. for (ll i = 0; i < n; i++)
  13. {
  14. for (ll j = 0; j < n; j++)
  15. cout << a[i][j] << " ";
  16. cout << '\n';
  17. }
  18. }
  19. };
  20. struct matran_me
  21. {
  22. matran_con a[2][2];
  23. void print()
  24. {
  25. for (ll i = 0; i < 2; i++)
  26. {
  27. for (ll j = 0; j < 2; j++)
  28. a[i][j].print();
  29. cout << '\n';
  30. }
  31. }
  32. };
  33. struct matran_1
  34. {
  35. matran_con a[1][2];
  36. void print()
  37. {
  38. for (ll i = 0; i < 1; i++)
  39. {
  40. for (ll j = 0; j < 2; j++)
  41. a[i][j].print();
  42. cout << '\n';
  43. }
  44. }
  45. };
  46. matran_con zero, one, A;
  47. matran_1 init,ress;
  48. matran_me M, zero_me, one_me;
  49. matran_con sum(matran_con A, matran_con B)
  50. {
  51. matran_con C;
  52. for (ll i = 0; i < n; i++)
  53. for (ll j = 0; j < n; j++)
  54. C.a[i][j] = (A.a[i][j] % mod + B.a[i][j] % mod) % mod;
  55. return C;
  56. }
  57. matran_con f(matran_con A, matran_con B)
  58. {
  59. matran_con C;
  60. for (ll i = 0; i < n; i++)
  61. for (ll j = 0; j < n; j++)
  62. C.a[i][j] = 0;
  63. for (ll i = 0; i < n; i++)
  64. for (ll j = 0; j < n; j++)
  65. for (ll k = 0; k < n; k++)
  66. C.a[i][j] = (C.a[i][j] + (A.a[i][k] % mod * B.a[k][j] % mod) % mod) % mod;
  67. return C;
  68. }
  69. matran_me prod(matran_me A, matran_me B)
  70. {
  71. matran_me C;
  72. for (ll i = 0; i < 2; i++)
  73. for (ll j = 0; j < 2; j++)
  74. C.a[i][j] = zero;
  75. for (ll i = 0; i < 2; i++)
  76. for (ll j = 0; j < 2; j++)
  77. for (ll k = 0; k < 2; k++)
  78. C.a[i][j] = sum(C.a[i][j], f(A.a[i][k], B.a[k][j]));
  79. return C;
  80. };
  81. matran_me po(matran_me A, ll n)
  82. {
  83. matran_me res = A, ans = one_me;
  84. while (n)
  85. {
  86. if (n % 2)
  87. ans = prod(ans, res);
  88. res = prod(res, res);
  89. n /= 2;
  90. }
  91. return ans;
  92. }
  93. matran_1 prod1(matran_1 A, matran_me B)
  94. {
  95. matran_1 C;
  96. for (ll i = 0; i < 1; i++)
  97. for (ll j = 0; j < 2; j++)
  98. C.a[i][j] = zero;
  99. for (ll i = 0; i < 1; i++)
  100. for (ll j = 0; j < 2; j++)
  101. for (ll k = 0; k < 2; k++)
  102. C.a[i][j] = sum(C.a[i][j], f(A.a[i][k], B.a[k][j]));
  103. return C;
  104. }
  105.  
  106. int main()
  107. {
  108.  
  109.  
  110. cin >> n >> k;
  111. for (ll i = 0; i < n; i++)
  112. for (ll j = 0; j < n; j++)
  113. cin >> A.a[i][j];
  114. // A.print();
  115. for (ll i = 0; i < n; i++)
  116. for (ll j = 0; j < n; j++)
  117. {
  118. zero.a[i][j] = 0;
  119. if (i == j)
  120. one.a[i][j] = 1;
  121. else
  122. one.a[i][j] = 0;
  123. }
  124. // one.print();
  125. // zero.print();
  126. init.a[0][0] = A;
  127. init.a[0][1] = one;
  128. // init.print();
  129. one_me.a[0][0] = one;
  130. one_me.a[0][1] = zero;
  131. one_me.a[1][0] = zero;
  132. one_me.a[1][1] = one;
  133. // cout<<"one_me"<<'\n';
  134. // po(one_me,3).print();
  135. M.a[0][0] = M.a[1][0] = A;
  136. M.a[0][1] = zero;
  137. M.a[1][1] = one;
  138. ress = prod1(init,po(M,k-1));
  139. ress.a[0][0].print();
  140. }
  141.  
Success #stdin #stdout 0s 4856KB
stdin
2 3
0 1
1 1
stdout
2 4 
4 6