题目描述:
给定一个n*n的矩阵,求该矩阵的k次幂,即P^k。
输入描述:
第一行:两个整数n(2<=n<=10)、k(1<=k<=5),两个数字之间用一个空格隔开,含义如上所示。
接下来有n行,每行n个正整数,其中,第i行第j个整数表示矩阵中第i行第j列的矩阵元素Pij且(0<=Pij<=10)。另外,数据保证最后结果不会超过10^8。
输出描述:
对于每组测试数据,输出其结果。格式为:
n行n列个整数,每行数之间用空格隔开,注意,每行最后一个数后面不应该有多余的空格。
#include <iostream>
using namespace std;
struct Matrix{
int row, col;
int matrix[10][10];
Matrix(int r, int c) : row(r), col(c){}
};
void InputMatrix(Matrix& x){
for(int i = 0; i < x.row; ++i){
for(int j = 0; j < x.col; ++j){
scanf("%d", &x.matrix[i][j]);
}
}
return;
}
void OutputMatrix(Matrix x){
for(int i = 0; i < x.row; ++i){
for(int j = 0; j < x.col; ++j){
if(j == x.col - 1){
printf("%d", x.matrix[i][j]);
}
else {
printf("%d ", x.matrix[i][j]);
}
}
printf("\n");
}
return;
}
Matrix Multiply(Matrix x, Matrix y){
Matrix answer(x.row, y.col);
for(int i = 0; i < answer.row; ++i){
for(int j = 0; j < answer.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;
}
Matrix Quick(Matrix x, int k){
Matrix answer(x.row, x.col);
for(int i = 0; i < answer.row; ++i){
for(int j = 0; j < answer.col; ++j){
if(i == j){
answer.matrix[i][j] = 1;
}else{
answer.matrix[i][j] = 0;
}
}
}
while(k != 0){
if(k % 2 == 1){
answer = Multiply(answer, x);
}
k /= 2;
x = Multiply(x, x);
}
return answer;
}
int main(){
int n, k;
while(~scanf("%d%d", &n, &k)){
Matrix x(n, n);
InputMatrix(x);
Matrix answer(n, n);
answer = Quick(x, k);
OutputMatrix(answer);
}
return 0;
}