BZOJ2396
给出三个行数和列数均为N的矩阵A、B、C,判断A*B=C是否成立
随机生成一个N乘1的矩阵R
然后判断A*B*R是否等于C*R,而前者相当于A*(B*R)
与后者一样都可以在O(N2)的时间里算出来
如果算出来的结果相等
A*B和C几乎也相等
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 using namespace std; 5 int n; 6 int a[1001][1001],b[1001][1001],c[1001][1001]; 7 int rnd[1001],ans1[1001],ans2[1001]; 8 void mmul(int a[1001],int b[1001][1001],int s[1001]) 9 { 10 int tmp[1001]; 11 for(int j=1;j<=n;j++) 12 { 13 tmp[j]=0; 14 for(int k=1;k<=n;k++) 15 tmp[j]+=a[k]*b[k][j]; 16 } 17 for(int i=1;i<=n;i++)s[i]=tmp[i]; 18 } 19 bool jud() 20 { 21 for(int i=1;i<=n;i++) 22 if(ans1[i]!=ans2[i])return 0; 23 return 1; 24 } 25 int main() 26 { 27 for(int i=1;i<=1000;i++)rnd[i]=rand(); 28 while(scanf("%d",&n)!=EOF) 29 { 30 for(int i=1;i<=n;i++) 31 for(int j=1;j<=n;j++) 32 scanf("%d",&a[i][j]); 33 for(int i=1;i<=n;i++) 34 for(int j=1;j<=n;j++) 35 scanf("%d",&b[i][j]); 36 for(int i=1;i<=n;i++) 37 for(int j=1;j<=n;j++) 38 scanf("%d",&c[i][j]); 39 mmul(rnd,a,ans1); 40 mmul(ans1,b,ans1); 41 mmul(rnd,c,ans2); 42 if(jud())printf("Yes "); 43 else printf("No "); 44 } 45 return 0; 46 }