随机化方法应用

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\n");
43         else printf("No\n");
44     }
45     return 0;
46 }

猜你喜欢

转载自www.cnblogs.com/aininot260/p/9635786.html