给定一个n*n的矩阵,求该矩阵的k次幂,即P^k
思路
1. 和求解整数幂的思路相同, 使用分治策略, 代码的框架是
int pow(a, b) {
c = pow(a, b/2)
c*= c;
if(b 为奇数)
c *= a;
return c
}
2. 这道题求的是矩阵, 上面的框架不太好用, 毕竟返回一个矩阵是有点不靠谱. 既然显式的返回矩阵不行, 那就玩个把戏, 隐式返回.
将矩阵设置为全局变量, 使得递归函数里对矩阵的操作全局有效, 就不需要显式返回矩阵了
3. 尝试仅使用两个矩阵得出结果, 但失败了, 计算矩阵乘法, 至少需要三个矩阵的空间吧
代码
#include <iostream> #include <stdio.h> using namespace std; int matrix1[12][12]; int matrix2[12][12]; int matrix3[12][12]; int n, k; void multimatrix(int x) { if(x == 1) return; multimatrix(x/2); for(int i = 0; i < n; i ++) { for(int j = 0; j < n; j ++) { int grid = 0; for(int k = 0; k < n; k ++) { grid += matrix2[i][k]*matrix2[k][j]; } matrix3[i][j] = grid; } } for(int i = 0; i < n; i ++) { for(int j = 0; j < n; j ++) { matrix2[i][j] = matrix3[i][j]; } } if(x&1) { for(int i = 0; i < n; i ++) { for(int j = 0; j < n; j ++) { int grid = 0; for(int k = 0; k < n; k ++) { grid += matrix2[i][k]*matrix1[k][j]; } matrix3[i][j] = grid; } } for(int i = 0; i < n; i ++) { for(int j = 0; j < n; j ++) { matrix2[i][j] = matrix3[i][j]; } } } } int main() { int t; scanf("%d", &t); for(int i = 0; i < t; i ++) { scanf("%d%d", &n, &k); for(int i = 0; i < n; i ++) { for(int j = 0; j < n; j ++) { scanf("%d", &matrix1[i][j]); matrix2[i][j] = matrix1[i][j]; } } multimatrix(k); for(int i = 0; i < n; i ++) { printf("%d", matrix2[i][0]); for(int j = 1; j < n; j ++) { printf(" %d", matrix2[i][j]); } printf("\n"); } } return 0; }