随机化算法codeforces Matrix God

Posted shulin~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了随机化算法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

 

以上是关于随机化算法codeforces Matrix God的主要内容,如果未能解决你的问题,请参考以下文章

Matrix God 随机化构造矩阵降维

Vasya and Magic Matrix CodeForces - 1042E (概率dp)

POJ 3318:Matrix Multiplication(随机算法)

Codeforces1102F Elongated Matrix 状压DP

Codeforces Round #439 (Div. 2) Problem E (Codeforces 869E) - 暴力 - 随机化 - 二维树状数组 - 差分

[Codeforces 486B] Or in Matrix