首页 > 其他 > 详细

bzoj2396 神奇的矩阵(随机化)

时间:2019-05-09 11:58:16      阅读:113      评论:0      收藏:0      [点我收藏+]
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;
}

 

bzoj2396 神奇的矩阵(随机化)

原文:https://www.cnblogs.com/kafuuchino/p/10837452.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!