/*
這個題目博主還是思考和調試了不少時間,因爲一直想讓自己的算法儘量少花時間(注意!!!矩陣元素非負時,矩陣的0次冪是單位矩陣!!!)。下面扔出C++代碼,和右邊界運行結果和時間(博主注意到,在N=30,M=5,且矩陣元素均爲10時,long long也是不夠用的,所以所給的截圖是把M改成了4的結果)。
PS:雖然右邊界會越界,但提交上去依舊AC了,因爲測試數據並沒有給那麼大,如果某dalao有好的建議,望不吝賜教!
*/
/*問題描述
給定一個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
*/
#include <iostream>
#include <algorithm>
#include <ctime>
using namespace std;
clock_t start,end;
int main()
{
long long int A[30][30],S[30][30],T[30][30],N,M;//S放最終結果。A放初始矩陣。T放中間計算過程矩陣
cin>>N>>M;
for(int i=0;i<N;i++)
for(int j=0;j<N;j++){
cin>>A[i][j];
S[i][j]=A[i][j];
T[i][j]=A[i][j];
}
start=clock();//計時
do{
if(M==0){
for(int i=0;i<N;i++)
for(int j=0;j<N;j++){
S[i][j]=0;
if(i==j) S[i][j]=1;
} //當要求矩陣的0次冪,結果爲單位陣
break;
}
if(M==1) break;
else{
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
int temp=0;
for(int k=0;k<N;k++){
temp+=(T[i][k]*A[k][j]);
}
S[i][j]=temp;
}
}
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
T[i][j]=S[i][j];
M--;
}
}while(M>1);
end=clock();//在打印之前結束計時
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
cout<<S[i][j]<<" ";
}
cout<<endl;
}
cout<<end-start<<" ms"<<endl;
return 0;
}