bzoj 2396: 神奇的矩阵 随机化
2017-08-10 07:22
323 查看
题意
给出三个行数和列数均为N的矩阵A、B、C,判断A*B=C是否成立。N不超过1000,矩阵中的数字大于等于0小于1000,数据组数不超过5组。
分析
随机化大法好!我们可以先随机出一个n*1的矩阵D,然后判断A*B*D是否和C*D相等即可。
代码
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; const int N=1005; int n,a ,b ,c ,d ,e ,f ,r ; bool check() { for (int i=1;i<=n;i++) if (e[i]!=f[i]) return 0; return 1; } int main() { for (int i=1;i<=1000;i++) r[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]); memset(f,0,sizeof(f)); memset(d,0,sizeof(d)); memset(e,0,sizeof(e)); for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) d[i]+=b[i][j]*r[j]; for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) e[i]+=a[i][j]*d[j],f[i]+=c[i][j]*r[j]; if (check()) puts("Yes"); else puts("No"); } return 0; }
相关文章推荐
- 【BZOJ 2396】神奇的矩阵 矩阵+随机
- bzoj2396神奇的矩阵 随机化
- bzoj2396 POJ3318 神奇的矩阵 随机化
- BZOJ[2396]神奇的矩阵 随机化
- BZOJ2396 神奇的矩阵
- bzoj2396 神奇的矩阵
- [bzoj2396][随机化]神奇的矩阵
- BZOJ2396 神奇的矩阵 【随机化 + 矩乘】
- 神奇的矩阵(bzoj 2396)
- bzoj2396 神奇的矩阵
- [随机化 矩阵乘法] BZOJ 2396 神奇的矩阵 & 51Nod 1140 矩阵相乘结果的判断 & POJ 3318 Matrix Multiplication
- 【BZOJ2396 || POJ3318】神奇的矩阵 || Matrix Multiplication
- [bzoj2396][随机化]神奇的矩阵
- 2396: 神奇的矩阵
- 【bzoj2396】神奇的矩阵 随机化
- BZOJ 1059 矩阵游戏(神奇的二分图匹配)
- BZOJ2875: [Noi2012]随机数生成器 矩阵乘法+快速乘
- BZOJ 3240 [Noi2013] 矩阵游戏 题解
- [BZOJ 3503][Cqoi 2014]和谐矩阵
- bzoj1059[ZJOI2007]矩阵游戏 二分图匹配