【随机化算法】codeforces Matrix God

http://codeforces.com/gym/101341

【题意】

  • 给定三个方阵A,B,C,问AB=C是否成立?
  • 方阵的规模最大为1000

【思路】

  • 求AB的时间复杂度为n*n*n,会超时
  • 左乘一个一行n列的向量,时间复杂度降为n*n

【Accepted】

 1 #include<iostream>
 2 #include<cstdio> 
 3 #include<cstring>
 4 #include<string>
 5 #include<algorithm>
 6 #include<cmath>
 7 #include<queue>
 8 
 9 using namespace std;
10 typedef long long ll;
11 const int inf=0x3f3f3f3f;
12 const int maxn=1e3+2;
13 const ll mod=1e9+7;
14 ll a[maxn][maxn],b[maxn][maxn],c[maxn][maxn],r[2][maxn],ra[2][maxn],rab[2][maxn],rc[2][maxn];
15 int n,m;
16 
17 int main()
18 {
19     while(~scanf("%d",&n))
20     {
21         for(int i=1;i<=n;i++)
22         {
23             for(int k=1;k<=n;k++)
24             {
25                 scanf("%lld",&a[i][k]);
26             }
27          } 
28         for(int i=1;i<=n;i++)
29         {
30             for(int k=1;k<=n;k++)
31             {
32                 scanf("%lld",&b[i][k]);
33             }
34          } 
35         for(int i=1;i<=n;i++)
36         {
37             for(int k=1;k<=n;k++)
38             {
39                 scanf("%lld",&c[i][k]);
40             }
41          } 
42         for(int i=1;i<=n;i++)
43         {
44             r[1][i]=rand()%100+1;
45         }
46         memset(ra,0,sizeof(ra));
47         memset(rab,0,sizeof(rab));
48         for(int i=1;i<=n;i++)
49         {
50             for(int k=1;k<=n;k++)
51             {
52                 ra[1][i]=(ra[1][i]+r[1][k]*a[k][i]%mod)%mod;
53             }
54         }
55         for(int i=1;i<=n;i++)
56         {
57             for(int k=1;k<=n;k++)
58             {
59                 rab[1][i]=(rab[1][i]+ra[1][k]*b[k][i]%mod)%mod;
60             }
61         }
62         for(int i=1;i<=n;i++)
63         {
64             for(int k=1;k<=n;k++)
65             {
66                 rc[1][i]=(rc[1][i]+r[1][k]*c[k][i]%mod)%mod;
67             }
68         }
69         int flag=1;
70         for(int i=1;i<=n;i++)
71         {
72             if(rab[1][i]!=rc[1][i])
73             {    
74                 flag=0;
75                 break;
76             }
77         }
78         if(flag)
79         {
80             puts("YES");
81         }
82         else
83         {
84             puts("NO");
85         }
86         
87     }    
88     return 0;
89  } 
View Code

 

posted @ 2017-07-18 18:34  shulin15  阅读(320)  评论(0编辑  收藏  举报