1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
|
vector<vector<int>> MatrixMul(vector<vector<int>>& x, vector<vector<int>>& y) { int sizeARow = x.size(); int sizeAColumn = x[0].size(); int sizeBColumn = y[0].size(); vector<vector<int>> result(sizeARow, vector<int>(sizeBColumn, 0)); for (int i = 0; i < sizeARow; ++i) { for (int j = 0; j < sizeBColumn; ++j) { for (int k = 0; k < sizeAColumn; ++k) { result[i][j] += x[i][k] * y[k][j]; } } } return result; }
vector<vector<int>> MatrixMul(vector<vector<int>>& x, vector<vector<int>>& y, int model) { int sizeARow = x.size(); int sizeAColumn = x[0].size(); int sizeBColumn = y[0].size(); vector<vector<int>> result(sizeARow, vector<int>(sizeBColumn, 0)); for (int i = 0; i < sizeARow; ++i) { for (int j = 0; j < sizeBColumn; ++j) { for (int k = 0; k < sizeAColumn; ++k) { result[i][j] = (result[i][j] + (x[i][k] % model) * (y[k][j] % model)) % model; } } } return result; }
vector<vector<int>> MatrixFastPower(int n) { --n; vector<vector<int>> matrix = {{1, 1}, {1, 0}}; vector<vector<int>> result = {{1, 0}, {0, 1}}; while (n) { if (n & 1) result = MatrixMul(result, matrix); n >>= 1; matrix = MatrixMul(matrix, matrix); } return result; }
|