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

时间: 2025-01-01 12:09:02

【随机化算法】codeforces Matrix God的相关文章

POJ 3318 Matrix Multiplication(随机化算法)

给你三个矩阵A,B,C.让你判断A*B是否等于C. 随机一组数据,然后判断乘以A,B之后是否与乘C之后相等. 很扯淡的啊,感觉这种算法不严谨啊... Matrix Multiplication Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16255   Accepted: 3515 Description You are given three n × n matrices A, B and C. Does the e

[ACM] POJ 3318 Matrix Multiplication (随机化算法)

Matrix Multiplication Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16118   Accepted: 3485 Description You are given three n × n matrices A, B and C. Does the equation A × B = C hold true? Input The first line of input contains a posit

POJ3318--Matrix Multiplication 随机化算法

Description You are given three n × n matrices A, B and C. Does the equation A × B = C hold true? Input The first line of input contains a positive integer n (n ≤ 500) followed by the the three matrices A, B and C respectively. Each matrix's descript

PKU 2531 Network Saboteur(dfs+剪枝||随机化算法)

题目大意:原题链接 给定n个节点,任意两个节点之间有权值,把这n个节点分成A,B两个集合,使得A集合中的每一节点与B集合中的每一节点两两结合(即有|A|*|B|种结合方式)权值之和最大. 标记:A集合:true  B集合:false 解法一:dfs+剪枝 #include<iostream> #include<cstring> using namespace std; int n,ans; bool in[25]; int graph[25][25]; void dfs(int i

快速排序的随机化算法

快速排序在最坏情况下的复杂度较高,采取随机化算法选择每次的分割点,能够在一定程度上使每次划分的平衡性更好. // // main.cpp // eoj1807 // // Created by Fangpin on 15/3/15. // Copyright (c) 2015年 FangPin. All rights reserved. // #include <iostream> #include <cstdlib> #include <cstdio> #includ

(每日算法)LeetCode--Set Matrix Zeroes (矩阵置零)

给定一个矩阵,如果有零元素那么就将零元素所在的行和列都置为零. Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. 最直观的解法就是开辟一个新的矩阵,当原矩阵存在零元素的时候,就将新矩阵的对应行和列置为零.这样空间复杂度较高,也是题目不允许的. 题目的难点就在于,如果遇到零元素之后马上在矩阵上操作,将所在的行和列都置为零.在接下来的遍历中,如果你再遇到零,你讲不

POJ2531——Network Saboteur(随机化算法水一发)

Network Saboteur DescriptionA university network is composed of N computers. System administrators gathered information on the traffic between nodes, and carefully divided the network into two subnetworks in order to minimize traffic between parts.A

【算法】Matrix - Tree 矩阵树定理 &amp; 题目总结

最近集中学习了一下矩阵树定理,自己其实还是没有太明白原理(证明)类的东西,但想在这里总结一下应用中的一些细节,矩阵树定理的一些引申等等. 首先,矩阵树定理用于求解一个图上的生成树个数.实现方式是:\(A\)为邻接矩阵,\(D\)为度数矩阵,则基尔霍夫(Kirchhoff)矩阵即为:\(K = D - A\).具体实现中,记 \(a\) 为Kirchhoff矩阵,则若存在 \(E(u, v)\) ,则\(a[u][u] ++, a[v][v] ++, a[u][v] --, a[v][u] --\

随机化算法之随机数

首先是介绍: 代码如下: //随机数类 //Random.hpp //===================================================== #ifndef RANDOM_HPP #define RANDOM_HPP #include<ctime> const unsigned long maxshort = 65536L; const unsigned long multiplier = 1194211693L; const unsigned long a