bzoj2396神奇的矩阵 随机化
2017-08-02 16:49
435 查看
Description 给出三个行数和列数均为N的矩阵A、B、C,判断A*B=C是否成立。 Input 题目可能包含若干组数据。 对于每组数据,第一行一个数N,接下来给出三个N*N的矩阵,依次为A、B、C三个矩阵。 Output 对于每组数据,若A*B=C成立,则输出Yes,否则No。每个答案占一行。 Sample Input 1 2 2 100 Sample Output No HINT 对于90%的数据,N不超过100; 对于100%的数据,N不超过1000,矩阵中的数字大于等于0小于1000,数据组数不超过5组。 Source
这题鬼畜。
我打了个暴力上去居然WA了?????????
我数组开小居然WA??????
懵逼.jpg
正解随机化,随机一个矩阵rnd,如果rnd*c=rnd*a*b,那么几乎a*b=c了。
问题是这还是n^3。
然后我们注意到矩阵乘法的意义,一个n*m乘以一个m*k的矩阵(m那里一定要相同不然不能乘),得到的是一个n*k的数组。
所以他循环的时候是这样的
i 1 n
j 1 m
K 1 k
然后我们发现可以把rnd变为一维的,就可以把一个n消掉了= =。
#include<cstdio> #include<algorithm> #include<cstring> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fd(i,a,b) for(int i=a;i>=b;i--) using namespace std; const int N=1e2+5; const int M=105; int a[N][N],b[N][N],c[N][N],d ,n; int rnd ,e ; inline void mul(int a[N],int b[N][N],int c ) { int tmp ; fo(j,1,n) { tmp[j]=0; fo(k,1,n) tmp[j]+=a[k]*b[k][j]; } fo(i,1,n)c[i]=tmp[i]; } inline bool pd() { fo(i,1,n) if (d[i]!=e[i])return 0; return 1; } int main() { fo(i,1,1000)rnd[i]=rand(); while (scanf("%d",&n)!=EOF) { fo(i,1,n) fo(j,1,n)scanf("%d",&a[i][j]); fo(i,1,n) fo(j,1,n)scanf("%d",&b[i][j]); fo(i,1,n) fo(j,1,n)scanf("%d",&c[i][j]); mul(rnd,a,d); mul(d,b,d); mul(rnd,c,e); if (pd())printf("Yes\n"); else printf("No\n"); } }
相关文章推荐
- bzoj2396 POJ3318 神奇的矩阵 随机化
- BZOJ[2396]神奇的矩阵 随机化
- bzoj 2396: 神奇的矩阵 随机化
- 【BZOJ 2396】神奇的矩阵 矩阵+随机
- bzoj2396 神奇的矩阵
- bzoj2396 神奇的矩阵
- BZOJ2396 神奇的矩阵
- [随机化 矩阵乘法] BZOJ 2396 神奇的矩阵 & 51Nod 1140 矩阵相乘结果的判断 & POJ 3318 Matrix Multiplication
- [bzoj2396][随机化]神奇的矩阵
- 神奇的矩阵(bzoj 2396)
- [bzoj2396][随机化]神奇的矩阵
- 【BZOJ2396 || POJ3318】神奇的矩阵 || Matrix Multiplication
- BZOJ2396 神奇的矩阵 【随机化 + 矩乘】
- 【bzoj2396】神奇的矩阵 随机化
- 2396: 神奇的矩阵
- BZOJ 1059 矩阵游戏(神奇的二分图匹配)
- bzoj 2738 矩阵乘法
- bzoj2396 Cirno的完美算数教室 容斥
- bzoj2126 排斥反应 矩阵乘法
- 神奇矩阵(9个数横竖对角线相加15)