码迷,mamicode.com
首页 > 其他好文 > 详细

CF1025B Weakened Common Divisor

时间:2018-08-21 17:44:04      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:style   auto   c++   mon   ret   实现   ken   ++   \n   

思路:

首先选取任意一对数(a, b),分别将a,b进行因子分解得到两个因子集合然后取并集(无需计算所有可能的因子,只需得到不同的质因子即可),之后再暴力一一枚举该集合中的元素是否满足条件。

时间复杂度:O(sqrt(amax) + n * log(amax))。

实现:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int MAXN = 150005;
 4 int a[MAXN], b[MAXN];
 5 set<int> factor(int x)
 6 {
 7     set<int> res;
 8     for (int i = 2; i * i <= x; i++)
 9     {
10         if (x % i == 0) 
11         {
12             res.insert(i);
13             while (x % i == 0) x /= i;
14         }
15     }
16     if (x != 1) res.insert(x);
17     return res;
18 }
19 int main()
20 {
21     int n;
22     while (scanf("%d", &n) != EOF)
23     {
24         for (int i = 0; i < n; i++) scanf("%d %d", &a[i], &b[i]);
25         set<int>s1 = factor(a[0]);
26         set<int>s2 = factor(b[0]);
27         set<int> st;
28         for (auto it: s1) st.insert(it);
29         for (auto it: s2) st.insert(it);
30         for (int i = 1; i < n; i++)
31         {
32             set<int> tmp;
33             for (auto it: st)
34             {
35                 if (it > a[i] && it > b[i]) continue;
36                 else if (a[i] % it && b[i] % it) continue;
37                 tmp.insert(it);
38             }
39             st = tmp;
40         }
41         if (st.empty()) puts("-1");
42         else printf("%d\n", *st.begin());
43     }
44     return 0;
45 }

 

CF1025B Weakened Common Divisor

标签:style   auto   c++   mon   ret   实现   ken   ++   \n   

原文地址:https://www.cnblogs.com/wangyiming/p/9512712.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!