题意就是给你矩阵 A B 求 AXB,注意值%3;
正常的方法是加入结果为C[][],c[i][j]= a[i][]一行 与b[][j]一列的乘积之和,然而按列取的话会超时(不是一般的坑):
#include <cstdio>
int a[805][805],b[805][805],c[805][805];
int main()
{
int n;
while(scanf("%d",&n)!=EOF){
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j){
scanf("%d",&a[i][j]);
a[i][j]%=3;
}
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j){
scanf("%d",&b[i][j]);
b[i][j]%=3;
}
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
int sum=0;
for(int k=1;k<=n;++k) sum+=a[i][k]*b[k][j];
c[i][j]=sum%3;
}
}
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j){
printf("%d",c[i][j]);
if(j<n) printf(" ");
else printf("\n");
}
}
return 0;
}
因为c++默认数据优先按行存储,对c理解较深的同学也知道,数组在内存中是用一段连续的空间保存二维数组的,所以按行取元素比按列取元素要快,附上ac代码1825ms(2000ms限制):
#include <cstdio>
#include <cstring>
int a[805][805],b[805][805],c[805][805];
int main()
{
int n;
while(scanf("%d",&n)!=EOF){
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j){
scanf("%d",&a[i][j]);
a[i][j]%=3;
}
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j){
scanf("%d",&b[i][j]);
b[i][j]%=3;
}
memset(c,0,sizeof(c));
for(int i=1;i<=n;++i){ //关键代码
for(int k=1;k<=n;++k){
for(int j=1;j<=n;++j)
c[i][j]+=a[i][k]*b[k][j];
}
}
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j){
printf("%d",c[i][j]%3);
if(j<n) printf(" ");
else printf("\n");
}
}
return 0;
}