原题http://acm.hdu.edu.cn/showproblem.php?pid=4920
Matrix multiplication
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 848 Accepted Submission(s): 339
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
Recommend
//开始的时候还以为这题要用到什么高深的算法。后来发现很多人过了,估计就是小技巧了
//首先。乘法的运算时间要比加法多。所以能避免乘法,尽量优化掉。
//经过这题,发现C++比G++跑的要更快,同样的代码差了差不多0.4秒。比赛的时候就是由于交了G++T了好多次
//最后,说一句,骚年,虽然暴力不是万能的。但是没有加上小技巧的暴力是万万不能的。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <limits.h>
#include <ctype.h>
#include <string.h>
#include <string>
#include <math.h>
#include <algorithm>
#include <iostream>
#include <queue>
#include <deque>
#include <set>
#include <map>
#include <vector>
using namespace std;
#define Max 800 + 5
int a[Max][Max];
int b[Max][Max];
int c[Max][Max];
int main(){
int n,i,j;
while(~scanf("%d",&n)){
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
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;
}
}
//int sum = 0;
int k;
for(i=0;i<n;i++){
//sum = 0;
for(k=0;k<n;k++){
if(a[i][k] == 0){
continue;
}
else{
for(j=0;j<n;j++){
c[i][j]+=a[i][k]*b[k][j];
}
}
}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(j != n-1){
printf("%d ",c[i][j]%3);
}
else{
printf("%d\n",c[i][j]%3);
}
}
}
}
return 0;
}