Matrix multiplication
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 5363 Accepted Submission(s): 2050
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)
#include<iostream>
#include<stdio.h>
using namespace std;
#define maxn 805
int n;
/*
本题考验优化能力,
计算矩阵相乘后对结果取模3,
所以所有数字为0,1,2这样,
可以认为其是一个稀疏矩阵,
关键在于把零参与的运算跳过这样,
为此,普通的三次方是行不通的,
所以对运算顺序进行调整,
调整技巧及见代码
*/
long long ma[maxn][maxn],mb[maxn][maxn],res[maxn][maxn];
int main()
{
while(scanf("%d",&n)==1)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
scanf("%d",&ma[i][j]);
ma[i][j]%=3;
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
scanf("%d",&mb[j][i]);
mb[j][i]%=3;
}
//memset(res,0,sizeof(res));
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
res[i][j]=0;
for(int k=0;k<n;k++)
res[i][j]+=ma[i][k]*mb[j][k];
if(j==n-1) printf("%d\n",res[i][j]%3);
else printf("%d ",res[i][j]%3);
}
//printf("%d ",res[i][j]);
//printf("\n");
}
return 0;
}
/*
当然,还有个小伏笔,
就是对于这种多输入的类型还可以采用快速输入的
操作进行优化,另一种就是用bitset数据类型,为此,确定该
题的算子特征,2*2=1,1*2=2,1*1=1,对每个数只要求其贡献度即可。
具体的后面再写
*/