您的位置:首页 > 其它

HDU 4920 Matrix multiplication(简单矩阵相乘+技巧减少Mod次数)

2015-11-22 15:35 435 查看

Matrix multiplication

Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)

Total Submission(s): 3866 Accepted Submission(s): 1590



[align=left]Problem Description[/align]
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.

[align=left]Input[/align]
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).

[align=left]Output[/align]
For each tests:

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

[align=left]Sample Input[/align]

1
0
1
2
0 1
2 3
4 5
6 7


[align=left]Sample Output[/align]

0
0 1
2 1


[align=left]Author[/align]
Xiaoxu Guo (ftiasch)

[align=left]Source[/align]
2014 Multi-University Training Contest 5

//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

,B

,re

;
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

,B

,re

;
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");
}

}
}
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: