如果你打开这篇博客,那么我就默认你已经学会了二维矩阵。
(关于矩阵的介绍我会再抽出一篇博客来讲)
那么既然大家已经会了矩阵和二维矩阵的相乘那么我就直接搬运AC代码了!
在看代码之前我们先关注几个点:
1.关于矩阵的乘法我们最好直接使用重载运算符的方法,这样的话可以使得代码的可读性变得很高并且使得代码十分简洁。
2.千万千万要注意数据范围(这道题的数据范围在longlong范围内所以一定要注意审题)
#include<bits/stdc++.h> #define esp 1000000007 #define int long long using namespace std; struct matry{ int w[101][101]={{0,0}}; int rows=0,columns=0;//行数和列数 friend matry operator * (matry x,matry y){ matry z; memset(z.w,0,sizeof(z.w)); z.rows=x.rows; z.columns=y.columns; if(x.columns!=y.rows){ return z; } else{ for(int i=1;i<=x.rows;i++){ for(int j=1;j<=y.columns;j++){ for(int k=1;k<=x.columns;k++){ z.w[i][j]+=(x.w[i][k]*y.w[k][j]); z.w[i][j]%=esp; } } } } return z; } }a; int n,k; matry mksm(matry x,int y){ matry z; memset(z.w,0,sizeof(z.w)); if(y==1) return x; z=mksm(x,y/2); z=z*z; if(y&1){ return x*z; } else{ return z; } } signed main(){ scanf("%lld%lld",&n,&k); a.rows=n; a.columns=n; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ scanf("%lld",&a.w[i][j]); } } matry q=mksm(a,k); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ printf("%lld ",q.w[i][j]); } puts(""); } return 0; }
End.