题意:验证两个矩阵A * B相乘是否等于C;
思路:直接相乘的话n^3,不行;
可以加入一个辅助行矩阵H,如果A * B = C,那么 H * A * B = H * C,因为H * A 之后还是一个行矩阵,时间复杂度为n^2。不过为了避免错误,H数组需要随机。
Code:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
using namespace std;
const int maxn = 500 + 10;
int a[maxn][maxn],b[maxn][maxn],c[maxn][maxn];
int h[maxn];
int d[maxn],e[maxn],f[maxn];
int n;
bool is_()
{
for(int i = 0; i < n; i ++)
{
d[i] = 0;
for(int j = 0; j < n; j ++)
d[i] += h[j] * a[j][i];
}
for(int i = 0; i < n; i ++)
{
e[i] = 0;
for(int j = 0; j < n; j ++)
e[i] += d[j] * b[j][i];
}
for(int i = 0; i < n; i ++)
{
f[i] = 0;
for(int j = 0; j < n; j ++)
f[i] += h[j] * c[j][i];
}
for(int i = 0; i < n; i ++)
{
if(e[i] != f[i])
return false;
}
return true;
}
int main()
{
while( ~ scanf("%d",&n))
{
for(int i = 0; i < n; i ++)
for(int j = 0; j < n; j ++)
scanf("%d",&a[i][j]);
for(int i = 0; i < n; i ++)
for(int j = 0; j < n; j ++)
scanf("%d",&b[i][j]);
for(int i = 0; i < n; i ++)
for(int j = 0; j < n; j ++)
scanf("%d",&c[i][j]);
int T = 20;
bool ans = true;
while(T --)
{
for(int i = 0; i < n; i ++)
h[i] = rand() % 100;
if(!is_())
{
ans = false;break;
}
}
if(ans)
puts("YES");
else puts("NO");
}
return 0;
}