因为是模3,所以把原矩阵拆成两个01矩阵,然后按分配律拆开分别进行矩阵乘法,行列用bitset来存进行优化即可
注意
int bitset<int>::count() 函数可以统计bitset里有多少1
int bitset<int>::any() 函数可以统计bitset里是否有1
/* (A+B)*(C+D)=A*C+A*D+B*C+B*D */ #include<bits/stdc++.h> using namespace std; #define maxn 805 struct Matrix{ int n; bitset<maxn>r[maxn];//按行表示 bitset<maxn>c[maxn];//按列表示 }A,B,C,D; int E[maxn][maxn],F[maxn][maxn],G[maxn][maxn],H[maxn][maxn]; int n; void mul(Matrix A,Matrix B,int res[maxn][maxn]){ bitset<maxn>tmp; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){ tmp=A.r[i]&B.c[j]; res[i][j]=tmp.count()%3; } } int main(){ while(cin>>n){ A.n=B.n=C.n=D.n=n; for(int i=1;i<=n;i++){ A.c[i].reset();A.r[i].reset(); B.c[i].reset();B.r[i].reset(); C.c[i].reset();C.r[i].reset(); D.c[i].reset();D.r[i].reset(); } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){ int x; scanf("%d",&x); x%=3; if(x>=1){ A.r[i][j]=1; A.c[j][i]=1; } if(x==2){ B.r[i][j]=1; B.c[j][i]=1; } } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){ int x; scanf("%d",&x); x%=3; if(x>=1){ C.r[i][j]=1; C.c[j][i]=1; } if(x==2){ D.r[i][j]=1; D.c[j][i]=1; } } mul(A,C,E);mul(A,D,F); mul(B,C,G);mul(B,D,H); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ int ans=E[i][j]+F[i][j]+G[i][j]+H[i][j]; if(j!=1) printf(" "); printf("%d",ans%3); } puts(""); } } }