题目:
Matrix multiplication
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 384 Accepted Submission(s): 138
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
传送门:点击打开链接
解题思路:
矩阵乘法优化,这题数据量800,用一般的矩阵乘法会超时,我们可以对齐进行优化。C=A*B,在读入的时候将B逆置,相乘的时候,c[i][j] = A的第i行×B的第j行。之前我是直接用经典的矩阵乘法做的,TLE,用斯特拉森矩阵算法也是TLE,哭瞎,这种思路还是听了tsm学弟说的,orz学弟。ps:这种做法要用C编译器提交。
相关论文:点击打开链接
代码:
#include <stdio.h>
int a[805][805], b[805][805], c[805][805];
int main()
{
int n, i, j, k, x;
while(~scanf("%d", &n))
{
for(i=0; i<n; i++)
for(j=0; j<n; j++)
{
scanf("%d", &x);
a[i][j] = x % 3;
}
for(i=0; i<n; i++)
for(j=0; j<n; j++)
{
scanf("%d", &x);
b[j][i] = x % 3;
}
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
c[i][j] = 0;
for(k=0; k<n; k++)
c[i][j] = c[i][j] + a[i][k]*b[j][k];
printf( j==0 ? "%d" : " %d",c[i][j]%3);
}
printf("\n");
}
}
return 0;
}