#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; }