给出三个N*N的矩阵A, B, C,问A * B是否等于C?
Input
第1行,1个数N。(0 <= N <= 500) 第2 - N + 1行:每行N个数,对应矩阵A的元素。(0 <= M[i] <= 16) 第N + 2 - 2N + 1行:每行N个数,对应矩阵B的元素。(0 <= M[i] <= 16) 第2N + 2 - 3N + 1行:每行N个数,对应矩阵C的元素。
Output
如果相等输出Yes,否则输出No。
Input示例
2 1 0 0 1 0 1 1 0 0 1 1 0
Output示例
Yes
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
const int MAXN = 505;
ll a[MAXN][MAXN], b[MAXN][MAXN], c[MAXN][MAXN];
int n;
ll rnd[MAXN], result1[MAXN], result2[MAXN], result3[MAXN];
int main()
{
srand(time(0));
cin >> n;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cin >> a[i][j];
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cin >> b[i][j];
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cin >> c[i][j];
}
}
int cnt = 20;
while (cnt--)
{
memset(result1, 0, sizeof(result1));
memset(result2, 0, sizeof(result2));
memset(result3, 0, sizeof(result3));
for (int i = 0; i < n; i++)
{
rnd[i] = (ll)rand() % 16;
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
result1[i] += rnd[j] * a[j][i];
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
result2[i] += result1[j] * b[j][i];
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
result3[i] += rnd[j] * c[j][i];
}
}
for (int i = 0; i < n; i++)
{
if (result2[i] != result3[i])
{
cout << "No" << endl;
return 0;
}
}
}
cout << "Yes" << endl;
return 0;
}