题目描述:
给定一个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; }