题目链接:1140
给出三个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
矩阵的乘法---为O(N^3)-----500^3=1.25*10^8--------超时
所以需要优化---通过矩阵的结合律可以将时间复杂度降到O(N^2)
构造一个行矩阵或者列矩阵X----1*n------
A*B==C 可以推出 X*A*B=X*C
而X*A的复杂度为1*N*N--------
为了保证程序的测定更准确---我们通过随机数来构造X----也可多构造几组X----
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long a1[2][520],a2[2][520],a3[2][520],a,kp[2][520];
int main()
{
int n;scanf("%d",&n);
for (int i=1;i<=n;i++)
{
kp[0][i]=rand()%10000+2;
kp[1][i]=rand()%10000+2;
}
memset(a1,0,sizeof(a1));
memset(a2,0,sizeof(a2));
memset(a3,0,sizeof(a3));
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
{
scanf("%lld",&a);
a1[0][j]+=kp[0][i]*a;
a1[1][j]+=kp[1][i]*a;
}
}
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
{
scanf("%lld",&a);
a2[0][j]+=a1[0][i]*a;
a2[1][j]+=a1[1][i]*a;
}
}
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
{
scanf("%lld",&a);
a3[0][j]+=kp[0][i]*a;
a3[1][j]+=kp[1][i]*a;
}
}
bool fafe=true;
for (int i=1;i<=n;i++)
if (a2[0][i]!=a3[0][i]||a2[1][i]!=a3[1][i])
{
fafe=false;
break;
}
printf("%s\n",fafe?"Yes":"No");
return 0;
}