hdu 4920 Matrix multiplication (矩阵计算)
2014-08-05 20:01
323 查看
题目链接
题意:给两个矩阵a, b, 计算矩阵a*b的结果对3取余。
分析:直接计算时间复杂度是O(n^3),会超时,但是下面第一个代码勉强可以水过,数据的原因。
再贴一个崔老师的代码:
他把所有的0都忽略了,很巧妙的优化,aa[][], bb[][]里存储的是下一个不为0的位置:
题意:给两个矩阵a, b, 计算矩阵a*b的结果对3取余。
分析:直接计算时间复杂度是O(n^3),会超时,但是下面第一个代码勉强可以水过,数据的原因。
#include <iostream> #include <cstdio> #include <vector> #include <cstring> #include <cstdlib> #include <algorithm> const int maxn = 800+10; using namespace std; int n, a[maxn][maxn], b[maxn][maxn], c[maxn][maxn]; int main() { int i, j, k; 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] %= 3; } for(i = 0; i < n; i++) for(j = 0; j < n; j++) { scanf("%d", &b[i][j]); b[i][j] %= 3; } for(i = 0; i < n; i++) { for(k = 0; k < n; k++) if(a[i][k]!=0) for(j = 0; j < n; j++) { c[i][j] += a[i][k]*b[k][j]; //c[i][j] %= 3; 加这个会超时 } } for(i = 0; i < n; i++) { for(j = 0; j < n; j++) if(j == 0) printf("%d", c[i][j]%3); else printf(" %d", c[i][j]%3); printf("\n"); } } return 0; }
再贴一个崔老师的代码:
他把所有的0都忽略了,很巧妙的优化,aa[][], bb[][]里存储的是下一个不为0的位置:
#include <iostream> #include<stdio.h> #include<vector> #include<queue> #include<stack> #include<string.h> #include<algorithm> #include<map> using namespace std; #define LL long long #define gcd(a,b) (b==0?a:gcd(b,a%b)) #define lcm(a,b) (a*b/gcd(a,b)) //O(n)求素数,1-n的欧拉数 #define N 100010 //A^x = A^(x % Phi(C) + Phi(C)) (mod C) int a[880][880]; int b[880][880]; int aa[880][880]; int bb[880][880]; int c[880][880]; int main() { int n; while(~scanf("%d",&n)) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(aa,0,sizeof(aa)); memset(bb,0,sizeof(bb)); memset(c,0,sizeof(c)); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { scanf("%d",&a[i][j]); a[i][j]%=3; } } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { scanf("%d",&b[i][j]); b[i][j]%=3; } } for(int i=1;i<=n;i++) { int x=-1; for(int j=n;j>=0;j--) { aa[i][j]=x; if(a[i][j])x=j; } } for(int i=1;i<=n;i++) { int x=-1; for(int j=n;j>=0;j--) { bb[i][j]=x; if(b[i][j])x=j; } } for(int i=1;i<=n;i++) { for(int j=aa[i][0];j!=-1;j=aa[i][j]) { for(int k=bb[j][0];k!=-1;k=bb[j][k]) c[i][k]+=a[i][j]*b[j][k]; } } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { printf("%d",c[i][j]%3); if(j!=n)printf(" "); else printf("\n"); } } } return 0; }
相关文章推荐
- HDU 4920 稀疏矩阵相乘
- hdu 4920 Matrix multiplication (矩阵相乘)
- hdu 4920 矩阵循环
- HDU 4920 Matrix multiplication(矩阵相乘小优化)
- HDU 4920 Matrix multiplication(矩阵相乘小优化)
- HDU 1082 矩阵乘法次数计算 写了半天搞定,很有成就感啊
- 矩阵快速幂计算hdu1575
- hdu--4920--原来一直写了速度慢的矩阵乘法
- hdu 4920暑假多校5的1010 Matrix multiplication 矩阵
- HDU 4920 Matrix multiplication(矩阵乘法,cin,cout超时呀)
- HDU 4920 Matrix multiplication(矩阵相乘)
- hdu 4920 Matrix multiplication(矩阵坑题)
- hdu 4920 Matrix multiplication(多校第5场,矩阵相乘)
- HDU 4920 Matrix multiplication(矩阵乘法)
- Hdu 4920 Matrix multiplication[矩阵乘法的时间复杂度优化]
- hdu 4920 Matrix multiplication(矩阵相乘)2014多校训练第5场
- 矩阵乘法 --- hdu 4920 : Matrix multiplication
- HDU 4920 Matrix multiplication(稀疏矩阵的乘法)不优化很容易TLE
- hdu 4920 Matrix multiplication(矩阵乘法)2014多培训学校5现场
- HDU 4920 Matrix multiplication(矩阵相乘)