Advertisement
Guest User

Untitled

a guest
Oct 17th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.87 KB | None | 0 0
  1. #include <iostream>
  2. #include <cassert>
  3.  
  4. class matrix
  5. {
  6. public:
  7. matrix(int N = 1, int M = 1)
  8. {
  9. width = M;
  10. length = N;
  11. values = new long long* [N];
  12. for (int i = 0; i < N; i++)
  13. {
  14. values[i] = new long long[M];
  15. }
  16. }
  17. matrix(int N, int M, long long** arr)
  18. {
  19. width = M;
  20. length = N;
  21. values = arr;
  22. }
  23.  
  24. matrix(const matrix& b)
  25. {
  26. width = b.width;
  27. length = b.length;
  28. values = new long long* [length];
  29. for (int i = 0; i < length; i++)
  30. {
  31. values[i] = new long long[width];
  32. for (int j = 0; j < width; j++)
  33. {
  34. values[i][j] = b.values[i][j];
  35. }
  36. }
  37. }
  38.  
  39. ~matrix()
  40. {
  41. for (int i = 0; i < length; i++)
  42. {
  43. delete[] values[i];
  44. }
  45. delete[] values;
  46. }
  47. matrix& operator= (const matrix& b)
  48. {
  49. for (int i = 0; i < length; i++)
  50. {
  51. delete[] values[i];
  52. }
  53. delete[] values;
  54. width = b.width;
  55. length = b.length;
  56. values = new long long* [length];
  57. for (int i = 0; i < length; i++)
  58. {
  59. values[i] = new long long[width];
  60. for (int j = 0; j < width; j++)
  61. {
  62. values[i][j] = b.values[i][j];
  63. }
  64. }
  65. return *this;
  66. }
  67. const matrix operator* (const matrix& b)
  68. {
  69. assert(width == b.length);
  70. long long** newValues = new long long* [length];
  71. for (int i = 0; i < length; i++)
  72. {
  73. newValues[i] = new long long[b.width];
  74. for (int j = 0; j < b.width; j++)
  75. {
  76. long long result = 0;
  77. for (int k = 0; k < width; k++)
  78. {
  79. result += values[i][k] * b.values[k][j];
  80. }
  81. newValues[i][j] = result;
  82. }
  83. }
  84. return matrix(length, width, newValues);
  85. }
  86. long long* operator[] (int i)
  87. {
  88. return values[i];
  89. }
  90. private:
  91. int width;
  92. int length;
  93. long long** values;
  94. };
  95.  
  96. matrix fastPowered(matrix x, long long y)
  97. {
  98. if (y == 1)
  99. {
  100. return matrix(x);
  101. }
  102. if (y % 2 == 1)
  103. {
  104. return matrix(x * fastPowered(x * x, y / 2));
  105. }
  106. else
  107. {
  108. return matrix(fastPowered(x * x, y / 2));
  109. }
  110. }
  111.  
  112. int main()
  113. {
  114. int N;
  115. int d;
  116. std::cin >> N >> d;
  117. long long** values = new long long* [N];
  118. for (int i = 0; i < N; i++)
  119. {
  120. values[i] = new long long[N];
  121. for (int j = 0; j < N; j++)
  122. {
  123. std::cin >> values[i][j];
  124. }
  125. }
  126. matrix M(N, N, values);
  127. M = fastPowered(M, d);
  128. for (int i = 0; i < N; i++)
  129. {
  130. for (int j = 0; j < N; j++)
  131. {
  132. std::cout << M[i][j] << " ";
  133. }
  134. std::cout << "\n";
  135. }
  136. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement