前言
傳送門
這裏要用到一些數學知識,任意一個非零方陣的零次方是單位矩陣,任意一個非零方陣的一次方是它本身。M次冪,只需要矩陣A相乘M-1次,注意每次矩陣相乘的結果存放到一箇中間矩陣temp數組中,這樣做是防止直接更新res數組後,對後面值計算的影響,故等到將整個矩陣計算出結果後,再把temp數組重新賦值給res數組,用於下一次矩陣相乘
正文
問題描述
給定一個N階矩陣A,輸出A的M次冪(M是非負整數)
例如:
A =
1 2
3 4
A的2次冪
7 10
15 22
輸入格式
第一行是一個正整數N、M(1<=N<=30, 0<=M<=5),表示矩陣A的階數和要求的冪數
接下來N行,每行N個絕對值不超過10的非負整數,描述矩陣A的值輸出格式
輸出共N行,每行N個整數,表示A的M次冪所對應的矩陣。相鄰的數之間用一個空格隔開
樣例輸入
2 2
1 2
3 4
樣例輸出
7 10
15 22
AC代碼
#include<iostream>
#include<cstdio>
int a[30][30],temp[30][30],res[30][30];
using namespace std;
//輸入結果
void printRes(int n){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("%d ",res[i][j]);
}
cout<<endl;
}
}
int main(){
int n,m;
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
scanf("%d",&a[i][j]);
res[i][j]=a[i][j];
}
}
//任意一個非零方陣的零次方是單位矩陣
if(m==0){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i==j)res[i][j]=1;
else res[i][j]=0;
}
}
printRes(n);
}else if(m==1){//一次冪爲本身
printRes(n);
}else{//二次冪及以上
for(int k=0;k<m-1;k++){//m-1次相乘
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
int sum=0;
for(int t=0;t<n;t++){
sum+=res[i][t]*a[t][j];//計算相乘後i行j列的值
}
temp[i][j]=sum;//賦值給臨時數組
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
res[i][j]=temp[i][j];//將一次矩陣乘法的結果更新到res中,用於下次相乘
}
}
}
printRes(n);
}
return 0;
}