bzoj2396 神奇的矩阵(随机化)
给出三个行数和列数均为N的矩阵A、B、C,判断A*B=C是否成立。
题目可能包含若干组数据。
对于每组数据,第一行一个数N,接下来给出三个N*N的矩阵,依次为A、B、C三个矩阵。
对于每组数据,若A*B=C成立,则输出Yes,否则No。每个答案占一行。
Sample Input
1
2
2
100
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; }