题解 | 矩阵幂 矩阵快速幂
矩阵幂
https://www.nowcoder.com/practice/31e539ab08f949a8bece2a7503e9319a
#define _CRT_SECURE_NO_WARNINGS #include <cstdio> #include <iostream> using namespace std; const int maxn = 10; struct Matrix { int row, col; int matrix[maxn][maxn]; Matrix() {}; Matrix(int r, int c) : row(r), col(c) {} }; Matrix multuply(Matrix x, Matrix y) { Matrix answer = Matrix(x.row, y.col); for (int i = 0; i < x.row; i++) { for (int j = 0; j < y.col; j++) { answer.matrix[i][j] = 0; for (int k = 0; k < x.col; k++) { answer.matrix[i][j] += x.matrix[i][k] * y.matrix[k][j]; } } } return answer; } void printmatrix(Matrix answer) { for (int i = 0; i < answer.row; i++) { for (int j = 0; j < answer.col; j++) { if(j!=0){ printf(" ");//每行最后一个数后面不应该有多余的空格 } printf("%d", answer.matrix[i][j]); } printf("\n"); } } Matrix fastexp(Matrix x, int k) { Matrix answer(x.row, x.col); for (int i = 0; i < x.row; i++) { for (int j = 0; j < x.col; j++) { if (i == j) { answer.matrix[i][j] = 1; } else { answer.matrix[i][j] = 0; } } } //类比 int answer =1; while (k != 0) { if (k % 2 == 1) { //answer*=x.matrix; answer = multuply(answer, x); } k /= 2; x = multuply(x, x); } return answer; } int main() { int n, k; while (scanf("%d%d", &n, &k) != EOF) { Matrix x(n, n); for (int i = 0; i < n; i++) { for (int j = 0; j <n; j++) { scanf("%d", &x.matrix[i][j]); } } Matrix answer =fastexp(x, k); printmatrix( answer); } return 0; }
矩阵与矩阵快速幂 文章被收录于专栏
数学问题中另外一个常考的知识点是矩阵。考查的内容不难,一般只考查矩阵的基本运算, 如矩阵加法、矩阵乘法、矩阵转置等。通常,可用一个二维数组来模拟矩阵 类似于普通快速幂,矩阵的快速幂就是高效求矩阵多幂次的方法,其思想和普通快速幂的 思想相同。唯一不同的地方在于,对数字的快速幂而言,其初始值是1;而对于矩阵快速幂而 言,其初始值是单位矩阵