bzoj2396 神奇的矩阵(随机化)

Time Limit: 5 Sec  Memory Limit: 512 MB

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

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

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

Sample Input

1
2
2
100

Sample Output

No

HINT

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

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


 

poj原题......就是改了下数据范围

详见:blog:poj3318 Matrix Multiplication

根据这题的数据范围$O(n^2),n<=1000$,每组大概判断17次,错误率$1/2^{17}$

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define rint register int
using namespace std;
#define N 1005
int i,j,k,n,a[N][N],b[N][N],c[N][N],d[N],e[N],f[N];
int main(){
    srand(19260817);
    while(scanf("%d",&n)!=EOF){
        for(i=1;i<=n;++i)
            for(j=1;j<=n;++j)
                scanf("%d",&a[i][j]);
        for(i=1;i<=n;++i)
            for(j=1;j<=n;++j)
                scanf("%d",&b[i][j]);
        for(i=1;i<=n;++i)
            for(j=1;j<=n;++j)
                scanf("%d",&c[i][j]);
        for(k=1;k<=17;++k){
            for(i=1;i<=n;++i) d[i]=rand()&1;
            for(e[i=1]=0;i<=n;e[++i]=0)
                for(j=1;j<=n;++j)
                    e[i]+=c[i][j]*d[j];
            for(f[i=1]=0;i<=n;f[++i]=0)
                for(j=1;j<=n;++j)
                    f[i]+=b[i][j]*d[j];
            for(i=1;i<=n;++i) d[i]=f[i];
            for(f[i=1]=0;i<=n;f[++i]=0)
                for(j=1;j<=n;++j)
                    f[i]+=a[i][j]*d[j];
            for(i=1;e[i]==f[i]&&i<=n;++i);
            if(i<=n) break;
        }puts(k>17?"Yes":"No");
    }return 0;
}

 

posted @ 2019-05-09 11:25  kafuuchino  阅读(171)  评论(0编辑  收藏  举报