考点:矩阵乘法,快速矩阵幂
本题:不使用快速幂运算也不会超时
方法一:快速幂:和普通数据类型的操作类似
#include<bits/stdc++.h>
using namespace std;
const int MAXSIZE=1001;
struct Mat {
int mat[MAXSIZE][MAXSIZE];
int row,col;
};
Mat mul(Mat a,Mat b);
Mat powMat(Mat a,int k);
int main() {
int n,k;
while(cin>>n>>k) {
Mat a;
a.row=n;
a.col=n;
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
cin>>a.mat[i][j];
}
}
Mat res;
res=powMat(a,k);
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
cout<<res.mat[i][j];
if(j!=n-1) {
cout<<" ";
}
}
cout<<endl;
}
}
return 0;
}
Mat mul(Mat a,Mat b) {
Mat ans;
ans.row=a.row;
ans.col=b.col;
memset(ans.mat,0,sizeof(ans.mat));
for(int i=0; i<ans.row; i++) {
for(int j=0; j<ans.col; j++) {
for(int k=0; k<a.col; k++) {
ans.mat[i][j]+=a.mat[i][k]*b.mat[k][j];
}
}
}
return ans;
}
Mat powMat(Mat a,int k) {
Mat ans;
ans.row=a.row;
ans.col=a.col;
for(int i=0; i<a.row; i++) {
for(int j=0; j<a.col; j++) {
ans.mat[i][j]=(i==j);
}
}
while(k) {
if(k&1) {
ans=mul(ans,a);
}
a=mul(a,a);
k>>=1;
}
return ans;
}