您的位置:首页 > 其它

hdu 4920 Matrix multiplication (矩阵计算)

2014-08-05 20:01 323 查看
题目链接

题意:给两个矩阵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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: