随机化算法之三
#include <iostream> //poj 3318
using namespace std;
int ma[505][505],mb[505][505],mc[505][505],n;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
scanf("%d",&ma[i][j]); //cin 会TLE
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
scanf("%d",&mb[i][j]);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
scanf("%d",&mc[i][j]);
int init[505],res1[505],res2[505],res3[505],s;
for(int i=1;i<=n;++i)
init[i]=rand()%100; //随机生成行向量I
for(int j=1;j<=n;++j)
{
s=0;
for(int i=1;i<=n;++i)
s+=init[i]*ma[i][j];
res1[j]=s;
}
for(int j=1;j<=n;++j)
{
s=0;
for(int i=1;i<=n;++i)
s+=res1[i]*mb[i][j];
res2[j]=s;
}
for(int j=1;j<=n;++j)
{
s=0;
for(int i=1;i<=n;++i)
s+=init[i]*mc[i][j];
res3[j]=s;
}
for(int j=1;j<=n;++j)
if(res2[j]!=res3[j])
{
printf("NO\n");
return 0;
}
printf("YES\n");
return 0;
}
//随机生成行向量I,则若A*B=C,那么必有I*A*B=I*C;
//逐一测试是否相等,时间复杂度是O(N^2),算法的随机性正体现在这里。