Matrix Multiplication
Time Limit: 2000MS Memory Limit: 65536K
Description
You are given three n × n matrices A, B and C. Does the equation A × B = C hold true?
Input
The first line of input contains a positive integer n (n ≤ 500) followed by the the three matrices A, B and C respectively. Each matrix's description is a block of n × n integers.
It guarantees that the elements of A and B are less than 100 in absolute value and elements of C are less than 10,000,000 in absolute value.
Output
Output "YES" if the equation holds true, otherwise "NO".
Sample Input
2
1 0
2 3
5 1
0 8
5 1
10 26
Sample Output
YES
题意:给定三个矩阵a,b,c,问a×b是否等于c?
分析:只需要设置一个列向量x,求a*(b*x),求c*x,看是否相等即可。
当然这不能保证正确,x是生成的随机向量,多次生成多次测试即可使错误概率大大减小。
#include<stdio.h>
#include<ctime>
#include<cstdlib>
#define ll __int64
int n;
ll a[501][501],b[501][501],c[501][501],x[501];
void input(ll x[501][501])
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%I64d",&x[i][j]);
}
void mul(ll z[501][501],ll x[501],ll ans[501])
{
for(int i=1;i<=n;i++)
{
ans[i]=0;
for(int j=1;j<=n;j++)
ans[i]+=z[i][j]*x[j];
}
}
bool check(ll x[501],ll y[501])
{
for(int i=1;i<=n;i++)
if(x[i]!=y[i]) return false;
return true;
}
int main()
{
scanf("%d",&n);
input(a);
input(b);
input(c);
int t=5;
while(t--)
{
ll ansa[501],ansb[501],ansc[501];
srand(time(NULL));
for(int i=1;i<=n;i++)
x[i]=rand()%500+1;
mul(b,x,ansa);
mul(a,ansa,ansb);
mul(c,x,ansc);
if(!check(ansb,ansc)){
printf("NO\n");
return 0;
}
}
printf("YES\n");
return 0;
}