題目:
Matrix multiplication
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 384 Accepted Submission(s): 138
bobo hates big integers. So you are only asked to find the result modulo 3.
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 Aij. The next n lines describe the matrix B in similar format (0≤Aij,Bij≤109).
Print n lines. Each of them contain n integers -- the matrix A×B in similar format.
傳送門:點擊打開鏈接
解題思路:
矩陣乘法優化,這題數據量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;
}