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"); } } } */
相关文章推荐
- 1094. The Largest Generation (25)
- 51单片机中断详解(上)
- 20151113chattr ,lsattr 使用,设置和查看特殊权限
- 微信支付
- 1094. The Largest Generation (25)
- 教你如何在ubuntu15.04安装 RVM
- HDU 1209 Clock(模拟)
- 查询优化(一:Bookmark Lookup)
- php的延迟静态绑定
- 在centos7搭建上svn,并用svn和http访问
- 再谈沟通
- 在jsp中连接数据库的用法(增删改查)
- 工厂设计模式
- DFS & BFS
- Hibernate基础
- 第八章 异常控制流
- 源代码管理和git 使用
- YII 路径总结
- javascript冒泡排序
- ios 方面常见的一些面试问题