HDU 4920(Matrix multiplication-矩阵乘法优化)
2015-09-03 20:29
330 查看
Matrix multiplication
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 3647 Accepted Submission(s): 1522
[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
[align=left]Recommend[/align]
We have carefully selected several similar problems for you: 5426 5425 5424 5423 5422
直接矩阵乘 O(n^3) 800^3=5120,0000 TLE
所以利用mod3的性质 稍加优化
#include<bits/stdc++.h> using namespace std; #define For(i,n) for(int i=1;i<=n;i++) #define Fork(i,k,n) for(int i=k;i<=n;i++) #define Rep(i,n) for(int i=0;i<n;i++) #define ForD(i,n) for(int i=n;i;i--) #define ForkD(i,k,n) for(int i=n;i>=k;i--) #define RepD(i,n) for(int i=n;i>=0;i--) #define Forp(x) for(int p=pre[x];p;p=next[p]) #define Forpiter(x) for(int &p=iter[x];p;p=next[p]) #define Lson (o<<1) #define Rson ((o<<1)+1) #define MEM(a) memset(a,0,sizeof(a)); #define MEMI(a) memset(a,127,sizeof(a)); #define MEMi(a) memset(a,128,sizeof(a)); #define INF (2139062143)| #define MAXN (800+10) #define F (3) #define pb push_back #define mp make_pair typedef long long ll; ll mul(ll a,ll b){return (a*b)%F;} ll add(ll a,ll b){return (a+b)%F;} ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;} void upd(ll &a,ll b){a=(a%F+b%F)%F;} int n,a[MAXN][MAXN],b[MAXN][MAXN],c[MAXN][MAXN]; int main() { // freopen("j.in","r",stdin); while(cin>>n) { For(i,n) For(j,n) scanf("%d",&a[i][j]),a[i][j]%=3; For(i,n) For(j,n) scanf("%d",&b[i][j]),b[i][j]%=3,c[i][j]=0; For(i,n) For(k,n) if (a[i][k]) For(j,n) c[i][j]=(c[i][j]+a[i][k]*b[k][j])%3; For(i,n) { For(j,n-1) printf("%d ",c[i][j]); printf("%d\n",c[i] ); } } return 0; }
相关文章推荐
- HDU 5113 Black And White (dfs)
- HDU 1565 方格取数(1)(最大点权独立集)
- hdu2604Queuing 矩阵快速幂
- ibatis分组查询结果的返回参数绑定问题解决方案
- Android实战技巧之四十:Android5.1.1源代码编译与烧写
- 内存分析
- call和apply
- 控制台下登录逻辑
- 隐藏实施过程
- Spring data 规范
- MEF实现设计上的“松耦合”
- java 常用方法
- 三、NoteEditor.java文件学习笔记
- 面试注意事项
- Xcode6无法安装VVDocumenter插件的解决方法
- DIV+CSS参数大全
- 虚拟机安装
- HDU 4916(Count on the path-树上除链上的节点外最小值[强制在线])
- 【Free】有关free释放的的案例
- 【英语】Bingo口语笔记(63) - 一个单词的多种发音