來自學長的矩陣模板
#include <cstdio>
struct Mat {
int N,M;
int m[15][15];
};
// 有時由於內存的關係無需用結構體,直接定義多組數組即可
Mat MatMul(Mat A,Mat B,int MOD) { //兩個相等矩陣的乘法,對於稀疏矩陣,有0處不用運算的優化
Mat tmp;
tmp.N=A.N;
tmp.M=B.M;
for(int i=0; i<A.N; i++) {
for(int j=0; j<B.M; j++) {
int sum=0;
for(int k=0; k<B.N; k++)
sum=(sum+A.m[i][k]*B.m[k][j])%MOD;
tmp.m[i][j]=sum;
}
}
/*
for(int i = 0; i < N; i++) {
for(int j = 0; j < m; j++) {
c[i][j] = 0;
}
}
for(int i = 0; i < N; i++) {
for(int k = 0; k < M; k++) {
if(a[i][k] == 0) continue;
for(int j = 0; j < m; j++) {
c[i][j] += a[i][k] * b[k][j];
}
}
}
*/
return tmp;
}
Mat MatPow(Mat mat,int n,int MOD) { //二分快速冪
Mat ans;
ans.N=ans.M=mat.N;
for(int i=0; i<ans.N; i++)
ans.m[i][i]=1;
while(n) {
if(n&1)
ans=MatMul(ans,mat,MOD);
mat=MatMul(mat,mat,MOD);
n>>=1;
}
return ans;
}
int main() {
Mat a,b;
int n,m;
scanf("%d %d",&n,&m);
a.N=n;
a.M=m;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++) {
scanf("%d",&a.m[i][j]);
}
scanf("%d %d",&n,&m);
b.N=n;
b.M=m;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
scanf("%d",&b.m[i][j]);
Mat res;
res=MatMul(a,b,10000000);
for(int i=0; i<res.N; i++) {
for(int j=0; j<res.M; j++) {
printf("%d%c",res.m[i][j],j==res.M-1?'\n':' ');
}
}
return 0;
}