Matrix multiplication
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 1155 Accepted Submission(s): 493
Problem Description
Given two matrices A and B of size n×n, find the product of them.
bobo hates big integers. So you are only asked to find the result modulo 3.
bobo hates big integers. So you are only asked to find the result modulo 3.
Input
The input consists of several tests. For each tests:
The first line contains n (1≤n≤800). Each of the following n lines contain n integers -- the description of the matrix A. The j-th integer in the i-th line equals A ij. The next n lines describe the matrix B in similar format (0≤A ij,B ij≤10 9).
The first line contains n (1≤n≤800). Each of the following n lines contain n integers -- the description of the matrix A. The j-th integer in the i-th line equals A ij. The next n lines describe the matrix B in similar format (0≤A ij,B ij≤10 9).
Output
For each tests:
Print n lines. Each of them contain n integers -- the matrix A×B in similar format.
Print n lines. Each of them contain n integers -- the matrix A×B in similar format.
Sample Input
1 0 1 2 0 1 2 3 4 5 6 7
Sample Output
0 0 1 2 1
今天是多校联合的第5场。哎,很久没留足迹了。颇感内疚呀!
题意很简单就求两个矩阵的乘积。当场就写了一个N^3的代码。tle,然后我就想到:strassen矩阵乘法,strassen矩阵乘法算法的复杂度为N^2.81优化了很多,但还是tle。我很无语了。这个也能超时。
最后学弟写了一个同样3方的代码,用c++能过。我不懂数据是怎么给的,感觉很是意外呀!代码也不解释,用C++能过。
悲催呀,G++会超时的
#include<stdio.h>
#include<cstring>
#define N 805
int n;
int a[N][N],b[N][N],c[N][N];
int main() {
int i,j,k;
while(scanf("%d",&n)!=EOF) {
for(i=0; i<n; i++) {
for(j=0; j<n; j++) {
scanf("%d",&a[i][j]);
a[i][j]=a[i][j]%3;
}
}
for(i=0; i<n; i++) {
for(j=0; j<n; j++) {
scanf("%d",&b[i][j]);
b[i][j]=b[i][j]%3;
}
}
memset(c,0,sizeof(c));
for(k=0; k<n; k++) {
for(i=0; i<n; i++) {
if(a[k][i]==0) continue;
for(j=0; j<n; j++) {
// if(b[i][j]==0) continue;//加了就超时,不知道为什么吗,那原理说这更优化,不懂
c[k][j]=(c[k][j]+a[k][i]*b[i][j])%3;
}
}
}
for(i=0; i<n; i++) {
for(j=0; j<n; j++) {
printf("%d",c[i][j]%3);
if(j<n-1) printf(" ");
}
printf("\n");
}
}
return 0;
}