【随机化算法】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 }