版权声明:本人小白,有错误之处恳请指出,感激不尽;欢迎转载 https://blog.csdn.net/stone_fall/article/details/88837019
题目描述
给定一个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列个整数,每行数之间用空格隔开,注意,每行最后一个数后面不应该有多余的空格。
示例1
输入
2 2
9 8
9 3
输出
复制
153 96
108 81
AC代码
#include<bits/stdc++.h>
using namespace std;
#define For(i,m,n) for(int i=m;i<n;i++)
#define MAXN 12
int Matrix[MAXN][MAXN];
int ans[MAXN][MAXN];
void M_input(int n,int _Matrix[][MAXN]){
For(i,0,n){
For(j,0,n){
scanf("%d",&_Matrix[i][j]);
}
}
}
void M_output(int n,int _Matrix[][MAXN]){
For(i,0,n){
For(j,0,n){
if(j!=0)printf(" ");
printf("%d",_Matrix[i][j]);
}
printf("\n");
}
}
void M_multi(int Matrix_A[][MAXN],int Matrix_B[][MAXN],int n){
int temp[MAXN][MAXN];
memset(temp,0,sizeof temp);
For(i,0,n){
For(j,0,n){
For(k,0,n){
temp[i][j] += Matrix_A[i][k]*Matrix_B[k][j];
}
}
}
For(i,0,n){
For(j,0,n){
Matrix_A[i][j] = temp[i][j];
}
}
}
//得到单位阵
void makeE(int n,int ans[][MAXN]){
For(i,0,n){
For(j,0,n){
if(i==j){
ans[i][j] = 1;
}
else{
ans[i][j]=0;
}
}
}
}
void quickPower(int n,int k,int _ans[][MAXN],int _Matrix[][MAXN]){
//初始化ans
makeE(n,_ans);
while(k){
if(k&1){
M_multi(_ans,_Matrix,n);
}
M_multi(_Matrix,_Matrix,n);
k>>=1;
}
}
int main()
{
int n,k;
while(scanf("%d %d",&n,&k)== 2){
M_input(n,Matrix);
quickPower(n,k,ans,Matrix);
M_output(n,ans);
}
return 0;
}