51nod1140 矩阵相乘结果的判断
题意 判断 矩阵 A * B 是否等于 C
随机矩阵
若 A*B==C ----> X*(A*B) = X*C
但是反向不能推
这时我们 随机出一个行向量 X 看一下是否符合该要求,
因为 出题人不知道我们 随机的矩阵长什么样,所以这样 随机一次这个矩阵就应该够了
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <cmath> 5 #include <string> 6 #include <algorithm> 7 #include <iomanip> 8 #include <iostream> 9 #include <ctime> 10 using namespace std ; 11 12 const int maxn = 501 ; 13 int n ; 14 int a[maxn][maxn],b[maxn][maxn],c[maxn][maxn],sum1[2][maxn],sum2[2][maxn],sum3[2][maxn] ; 15 int rnd[maxn][maxn] ; 16 bool ok ; 17 18 using namespace std ; 19 20 int main() 21 { 22 scanf("%d",&n) ; 23 srand(time(0)) ; 24 for(int i=1;i<=n;i++) 25 for(int j=1;j<=n;j++) scanf("%d",&a[ i ][ j ]) ; 26 for(int i=1;i<=n;i++) 27 for(int j=1;j<=n;j++) scanf("%d",&b[ i ][ j ]) ; 28 for(int i=1;i<=n;i++) 29 for(int j=1;j<=n;j++) scanf("%d",&c[ i ][ j ]) ; 30 for(int i=1;i<=n;i++) rnd[1][i] = rand() % 17; 31 int i = 1 ; 32 for(int j=1;j<=n;j++) 33 for(int k=1;k<=n;k++) 34 sum1[i][j] += rnd[i][k] * a[k][j] ; 35 for(int j=1;j<=n;j++) 36 for(int k=1;k<=n;k++) 37 sum2[i][j] += sum1[i][k] * b[k][j] ; 38 for(int j=1;j<=n;j++) 39 for(int k=1;k<=n;k++) 40 sum3[i][j] += rnd[i][k] * c[k][j] ; 41 ok = 1 ; 42 for(int j=1;j<=n;j++) if(sum2[1][j] != sum3[1][j]) ok = false ; 43 if(ok) printf("Yes\n") ; 44 else printf("No\n") ; 45 46 return 0 ; 47 }