描述
题解
矩阵乘法的复杂度是 O(n^3),大概会超时,所以需要降维,可以构造一个 X 矩阵,根据矩阵乘法结合律来判断 X * A * B == X * C,但是这种解法存在一个隐患,也就是降维会存在信息的丢失,最后可能出现结果不对的情况,虽然这种情况出现的几率十分低,但是处于安全的考虑,还是随机生成 X 矩阵比较好,并且在时间允许的范围内进行双 X 矩阵判定更安全,具体的看代码吧~~~
代码
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
typedef long long ll;
ll A[2][520];
ll B[2][520];
ll C[2][520];
ll X[2][520];
int main()
{
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{ // 随机生成两个 1 * n 矩阵
X[0][i] = rand() % 10000 + 2;
X[1][i] = rand() % 10000 + 2;
}
memset(A, 0, sizeof(A));
memset(B, 0, sizeof(B));
memset(C, 0, sizeof(C));
ll key;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
scanf("%lld", &key);
A[0][j] += X[0][i] * key;
A[1][j] += X[1][i] * key;
}
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
scanf("%lld", &key);
B[0][j] += A[0][i] * key;
B[1][j] += A[1][i] * key;
}
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
scanf("%lld", &key);
C[0][j] += X[0][i] * key;
C[1][j] += X[1][i] * key;
}
}
bool flag = true;
for (int i = 1; i <= n; i++)
{
if (B[0][i] != C[0][i] || B[1][i] != C[1][i])
{
flag = false;
break;
}
}
printf("%s\n", flag ? "Yes" : "No");
return 0;
}