您的位置:首页 > 其它

bzoj 2396: 神奇的矩阵 随机化

2017-08-10 07:22 323 查看

题意

给出三个行数和列数均为N的矩阵A、B、C,判断A*B=C是否成立。

N不超过1000,矩阵中的数字大于等于0小于1000,数据组数不超过5组。

分析

随机化大法好!

我们可以先随机出一个n*1的矩阵D,然后判断A*B*D是否和C*D相等即可。

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;

const int N=1005;

int n,a

,b

,c

,d
,e
,f
,r
;

bool check()
{
for (int i=1;i<=n;i++) if (e[i]!=f[i]) return 0;
return 1;
}

int main()
{
for (int i=1;i<=1000;i++) r[i]=rand();
while (scanf("%d",&n)!=EOF)
{
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
scanf("%d",&a[i][j]);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
scanf("%d",&b[i][j]);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
scanf("%d",&c[i][j]);
memset(f,0,sizeof(f));
memset(d,0,sizeof(d));
memset(e,0,sizeof(e));
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
d[i]+=b[i][j]*r[j];
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
e[i]+=a[i][j]*d[j],f[i]+=c[i][j]*r[j];
if (check()) puts("Yes");
else puts("No");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: