51nod-1140: 矩阵相乘结果的判断

【传送门:51nod-1140


简要题意:

  给出矩阵A,B,C,判断A*B是否等于C


题解:

  对于一般的判定,自然是n3将A*B求出来,然后再逐位判断

  但是这自然是超时的

  那么我们可以随机出一个高度为1,长度为n的矩阵X

  如果A*B=C,那么根据结合律我们可以得到X*A*B=X*C,而求X*A*B和X*C显然只用n2的时间,那么这样我们就能判断出是否相等

  PS:如果觉得得出的答案不保险,可以随机多次


参考代码:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<ctime>
using namespace std;
typedef long long LL;
struct node
{
    LL a[510][510];
    node()
    {
        memset(a,0,sizeof(a));
    }
}A,B,C,cmp;
int n;
node chengfa(node a,node b)
{
    node c;
    for(int j=1;j<=n;j++)
    {
        for(int k=1;k<=n;k++)
        {
            c.a[1][j]+=a.a[1][k]*b.a[k][j];
        }
    }
    return c;
}
bool check(node a,node b)
{
    for(int i=1;i<=n;i++) if(a.a[1][i]!=b.a[1][i]) return false;
    return true;
}
int main()
{
    //srand(time(0));
    scanf("%d",&n);
    for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%lld",&A.a[i][j]);
    for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%lld",&B.a[i][j]);
    for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%lld",&C.a[i][j]);
    for(int i=1;i<=n;i++) cmp.a[1][i]=rand()%10000+2;
    node a,b;
    a=chengfa(chengfa(cmp,A),B),b=chengfa(cmp,C);
    if(check(a,b)==true) printf("Yes\n");
    else printf("No\n");
    return 0;
}

 

posted @ 2018-10-08 07:19  Star_Feel  阅读(426)  评论(0编辑  收藏  举报