题意 : 给你三个n维矩阵,让你判断A*B是否等于C。
思路 :优化将二维转化成一维的。随机生成一个一维向量d,使得A*(B*d)=C*d,多次生成多次测试即可使错误概率大大减小。
1 //3318 2 #include <stdio.h> 3 #include <string.h> 4 #include <time.h> 5 #include <stdlib.h> 6 #include <iostream> 7 8 using namespace std ; 9 10 int a[1010][1010],b[1010][1010],c[1010][1010] ; 11 int d[1010],c1[1010],d1[1010],ans[1010] ; 12 13 int main() 14 { 15 int n ; 16 while(~scanf("%d",&n)) 17 { 18 for(int i = 0 ; i < n ; i++) 19 for(int j = 0 ; j < n ; j++) 20 scanf("%d",&a[i][j]) ; 21 for(int i = 0 ; i < n ; i++) 22 for(int j = 0 ; j < n ; j++) 23 scanf("%d",&b[i][j]) ; 24 for(int i = 0 ; i < n ; i++) 25 for(int j = 0 ; j < n ; j++) 26 scanf("%d",&c[i][j]) ; 27 srand((unsigned int)time(0)); 28 for(int i=0; i<n; i++) 29 { 30 d[i]=rand()%100; 31 } 32 for(int i = 0 ; i < n ; i++) 33 for(int j = 0 ; j < n ; j++) 34 { 35 d1[i] += b[i][j]*d[j] ;//二维乘一维等于一维,一维乘二维等于二维 36 c1[i] += c[i][j]*d[j] ; 37 } 38 for(int i = 0 ; i < n ; i++) 39 for(int j = 0 ; j < n ; j++) 40 ans[i] += a[i][j]*d1[j] ; 41 bool flag = false ; 42 for(int i = 0 ; i < n ; i++) 43 if(ans[i] != c1[i]) 44 { 45 flag = true ; 46 break ; 47 } 48 if(!flag) 49 printf("YES ") ; 50 else printf("NO ") ; 51 } 52 return 0 ; 53 }