zoukankan      html  css  js  c++  java
  • 神奇的矩阵(bzoj 2396)

    Description

        给出三个行数和列数均为N的矩阵A、B、C,判断A*B=C是否成立。

    Input


        题目可能包含若干组数据。
        对于每组数据,第一行一个数N,接下来给出三个N*N的矩阵,依次为A、B、C三个矩阵。

    Output

        对于每组数据,若A*B=C成立,则输出Yes,否则No。每个答案占一行。

    Sample Input

    1
    2
    2
    100

    Sample Output

    No

    HINT

        对于90%的数据,N不超过100;

        对于100%的数据,N不超过1000,矩阵中的数字大于等于0小于1000,数据组数不超过5组。

    /*
        直接判断是O(n^3)的,显然不行,我们发现,如果A*B=C,那么(A*B)*R=C*R。
        可以利用以上结论,设R为一个1*n的随机矩阵,如果(A*B)*R与C*R相等,那么A*B与C大几率相等。 
    */
    #include<cstdio>
    #include<iostream>
    #include<cstdlib>
    #define N 1010
    using namespace std;
    int a[N][N],b[N][N],c[N][N],rnd[N],ans1[N],ans2[N],n;
    void mul(int a[N],int b[N][N],int c[N]){
        int tmp[N]={0};
        for(int j=1;j<=n;j++)
            for(int i=1;i<=n;i++)
                tmp[j]+=a[i]*b[i][j];
        for(int i=1;i<=n;i++) c[i]=tmp[i];
    }
    int main(){
        freopen("jh.in","r",stdin);
        for(int i=1;i<=1000;i++) rnd[i]=rand();
        while(scanf("%d",&n)!=EOF){
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                    scanf("%d",&a[i][j]);
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                    scanf("%d",&b[i][j]);
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                    scanf("%d",&c[i][j]);
            mul(rnd,a,ans1);
            mul(ans1,b,ans1);
            mul(rnd,c,ans2);
            int flag=0;
            for(int i=1;i<=n;i++)
                if(ans1[i]!=ans2[i]) {flag=1;break;}
            if(!flag) printf("Yes
    ");
            else printf("No
    ");
        }    
        return 0;
    }
  • 相关阅读:
    VBA基础一:对象、属性、方法、变量
    js画吊线图
    C++读取硬盘物理序列号-非管理员权限
    什么是句柄?
    2020年WIN7系统的几个问题处理
    静态分析:IDA逆向代码段说明 text、idata、rdata、data
    入门级汇编语法句读
    Ollydbg 单步跟踪F8
    IDA使用之旅(四)
    CSP认证201409-1-相邻数对-(Java)100分
  • 原文地址:https://www.cnblogs.com/harden/p/6637839.html
Copyright © 2011-2022 走看看