题意
给出三个行数和列数均为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[N][N],b[N][N],c[N][N],d[N],e[N],f[N],r[N];
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;
}