BZOJ[2396]神奇的矩阵 随机化
2018-02-10 18:28
357 查看
传送门ber~
要判断A×B=CA×B=C,可以rand出一个1∗n1∗n的矩阵r,则一定有r×A×B=r×Cr×A×B=r×C,因为矩阵乘法满足结合律,那么就有(r×A)×B=r×C(r×A)×B=r×C算出r×Ar×A在乘上BB判断是否等于r×Cr×C就(大致)可以了
好种子取一遍判断就可以了
思想大概就是把两个n∗nn∗n的矩阵相乘转化成了1∗n1∗n的矩阵和n∗nn∗n的矩阵相乘,时间复杂度为n2n2
代码如下:
要判断A×B=CA×B=C,可以rand出一个1∗n1∗n的矩阵r,则一定有r×A×B=r×Cr×A×B=r×C,因为矩阵乘法满足结合律,那么就有(r×A)×B=r×C(r×A)×B=r×C算出r×Ar×A在乘上BB判断是否等于r×Cr×C就(大致)可以了
好种子取一遍判断就可以了
思想大概就是把两个n∗nn∗n的矩阵相乘转化成了1∗n1∗n的矩阵和n∗nn∗n的矩阵相乘,时间复杂度为n2n2
代码如下:
#include<cstdlib> #include<ctype.h> #include<cstdio> #define N 1005 using namespace std; inline int read(){ int x=0,f=1;char c; do {c=getchar();if(c=='-') f=-1;}while(!isdigit(c)); do x=(x<<3)+(x<<1)+c-'0',c=getchar(); while(isdigit(c)); return x*f; } inline int min(int a,int b){return a<b?a:b;} int T,n; int r ,d1 ,d2 ,d3 ; struct Matrix{ int a ; inline void read_Matrix(int k){ for(int i=1;i<=k;i++) for(int j=1;j<=k;j++) a[i][j]=read(); } }a,b,c; inline void mul(int a[],int b ,int c[]){ for(int i=1;i<=n;i++){ c[i]=0; for(int j=1;j<=n;j++) c[i]+=a[j]*b[j][i]; } } inline bool check(){ mul(r,a.a,d1); mul(d1,b.a,d2); mul(r,c.a,d3); for(int i=1;i<=n;i++) if(d3[i]!=d2[i]) return false; return true; } main(){ srand(19260817); for(int i=1;i<=1000;i++) r[i]=rand();//随机矩阵 while(scanf("%d",&n)!=EOF){ a.read_Matrix(n);b.read_Matrix(n);c.read_Matrix(n); if(check()) puts("Yes"); else puts("No"); } return 0; }
相关文章推荐
- 【BZOJ 2396】神奇的矩阵 矩阵+随机
- bzoj2396 POJ3318 神奇的矩阵 随机化
- bzoj2396神奇的矩阵 随机化
- bzoj 2396: 神奇的矩阵 随机化
- BZOJ2396 神奇的矩阵
- 【BZOJ2396 || POJ3318】神奇的矩阵 || Matrix Multiplication
- BZOJ2396 神奇的矩阵 【随机化 + 矩乘】
- [bzoj2396][随机化]神奇的矩阵
- [随机化 矩阵乘法] BZOJ 2396 神奇的矩阵 & 51Nod 1140 矩阵相乘结果的判断 & POJ 3318 Matrix Multiplication
- bzoj2396 神奇的矩阵
- bzoj2396 神奇的矩阵
- 神奇的矩阵(bzoj 2396)
- [bzoj2396][随机化]神奇的矩阵
- BZOJ 1059 矩阵游戏(神奇的二分图匹配)
- 【bzoj2396】神奇的矩阵 随机化
- 2396: 神奇的矩阵
- 【BZOJ 3503】【CQOI 2014】和谐矩阵
- 【GDOI2018模拟8.14】神奇的矩阵
- [乱搞] BZOJ 2296 [POJ Challenge] 随机种子
- 【BZOJ1059】矩阵游戏(二分图最大匹配)