Matrix multiplication

来源:互联网 发布:编程入门教材 编辑:程序博客网 时间:2024/05/22 13:56

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.
 

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 Aij. The next n lines describe the matrix B in similar format (0≤Aij,Bij≤109).
 

Output
For each tests:

Print n lines. Each of them contain n integers -- the matrix A×B in similar format.
 

Sample Input
10120 12 34 56 7
 

Sample Output
00 12 1
 


今天是多校联合的第5场。哎,很久没留足迹了。颇感内疚呀!

题意很简单就求两个矩阵的乘积。当场就写了一个N^3的代码。tle,然后我就想到:strassen矩阵乘法,strassen矩阵乘法算法的复杂度为N^2.81优化了很多,但还是tle。我很无语了。这个也能超时。

最后学弟写了一个同样3方的代码,用c++能过。我不懂数据是怎么给的,感觉很是意外呀!代码也不解释,用C++能过。

悲催呀,G++会超时的



#include<stdio.h>#include<cstring>#define N 805int 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;}







0 0