题目大意:
给定三个
n
∗
n
n*n
n∗n的矩阵
A
A
A,
B
B
B,
C
C
C,判断是否
A
∗
B
=
C
A*B=C
A∗B=C。
其中
n
≤
1000
n≤1000
n≤1000。
分析:
我们随机一个
n
∗
1
n*1
n∗1的矩阵
R
R
R,对于满足上述式子的一个答案,必然有
A
∗
B
∗
R
=
C
∗
R
A*B*R=C*R
A∗B∗R=C∗R。
而
A
∗
B
∗
R
=
A
∗
(
B
∗
R
)
A*B*R=A*(B*R)
A∗B∗R=A∗(B∗R),都可以在
O
(
n
2
)
O(n^2)
O(n2)做出。
代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstdlib>
#define LL long long
const int maxn=1001;
using namespace std;
int n;
int a[maxn][maxn],b[maxn][maxn],c[maxn][maxn];
int rad[maxn],ans1[maxn],ans2[maxn],tmp[maxn];
bool check()
{
for (int i=1;i<=n;i++) rad[i]=rand()%1000;
for (int i=1;i<=n;i++)
{
tmp[i]=0;
for (int j=1;j<=n;j++) tmp[i]+=c[j][i]*rad[j];
}
for (int i=1;i<=n;i++) ans2[i]=tmp[i];
for (int i=1;i<=n;i++)
{
tmp[i]=0;
for (int j=1;j<=n;j++) tmp[i]+=b[j][i]*rad[j];
}
for (int i=1;i<=n;i++) ans1[i]=tmp[i];
for (int i=1;i<=n;i++)
{
tmp[i]=0;
for (int j=1;j<=n;j++) tmp[i]+=a[j][i]*ans1[j];
}
for (int i=1;i<=n;i++) ans1[i]=tmp[i];
int flag=1;
for (int i=1;i<=n;i++) if (ans1[i]!=ans2[i]) return 0;
return 1;
}
void solve()
{
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]);
}
int flag=1;
for (int i=1;i<=20;i++) flag&=check();
if (flag) printf("Yes\n");
else printf("No\n");
}
int main()
{
srand((unsigned)time(0));
while (scanf("%d",&n)!=EOF) solve();
}