• 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
    ");
        else printf("No
    ");
        return 0;
    }

     

  • 相关阅读:
    补发《超级迷宫》站立会议九
    补发《超级迷宫》站立会议八
    补发《超级迷宫》站立会议七
    补发《超级迷宫》站立会议六
    一周开发项目
    所学的内容
    开发项目和所用时间 感想
    自我介绍
    大容量数据转移操作命令——BULK INSERT(类似于BCP)
    字符编码与文件处理
  • 原文地址:https://www.cnblogs.com/Never-mind/p/9752360.html
Copyright © 2020-2023  润新知