Matrix multiplication
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 3866 Accepted Submission(s): 1590
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
Author
Xiaoxu Guo (ftiasch)
Source
//mod3为0的话这个可以优化 跳过循环
//别人的代码 对如果存在很多0的矩阵可以变快
/*
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int a[808][808];
int b[808][808];
int ans[808][808];
int main()
{
int n;
while (~scanf("%d",&n))
{
for (int i=1;i<=n;i++)
for (int t=1;t<=n;t++)
{
scanf("%d",&a[i][t]);
a[i][t]%=3;
}
for (int i=1;i<=n;i++)
for (int t=1;t<=n;t++)
{
scanf("%d",&b[i][t]);
b[i][t]%=3;
}
for (int i=1;i<=n;i++)
for (int t=1;t<=n;t++)
ans[i][t]=0;
for (int i=1;i<=n;i++)
for (int k=1;k<=n;k++)
{
if (a[i][k]==0)
continue ;
for (int t=1;t<=n;t++)
ans[i][t]+=a[i][k]*b[k][t];
}
for (int i=1;i<=n;i++)
{
printf("%d",ans[i][1]%3);
for (int t=2;t<=n;t++)
printf(" %d",ans[i][t]%3);
printf("\n");
}
}
}
*/
//但是本代码是使用减少Mod求余的次数 也可以过 1750MS
#include <cstdio>
#include <iostream>
#include <string.h>
using namespace std;
const int N=800+10;
int A[N][N],B[N][N],re[N][N];
int n;
inline void handle(){
int i,j,z;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
for(z=0;z<n;z++)
re[i][j]+=A[i][z]*B[z][j];
}
int main(){
int i,j;
while(scanf("%d",&n)==1){
for(i=0;i<n;i++)
for(j=0;j<n;j++){
scanf("%d",&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]%=3;
re[i][j]=0;
}
handle();
for(i=0;i<n;i++){
printf("%d",re[i][0]%3);
for(j=1;j<n;j++)
printf(" %d",re[i][j]%3);
printf("\n");
}
}
}
/*TLE*/
/*
#include <cstdio>
#include <iostream>
#include <string.h>
using namespace std;
const int N=800+10;
int A[N][N],B[N][N],re[N][N];
int n;
inline void handle(){
int i,j,z;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
for(z=0;z<n;z++)
{
re[i][j]+=A[i][z]*B[z][j];
re[i][j]%=3;
}
}
int main(){
int i,j;
while(scanf("%d",&n)==1){
for(i=0;i<n;i++)
for(j=0;j<n;j++){
scanf("%d",&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]%=3;
re[i][j]=0;
}
handle();
for(i=0;i<n;i++){
for(j=0;j<n;j++)
printf("%d ",re[i][j]);
printf("\n");
}
}
}
*/