CF1025B Weakened Common Divisor

Posted wangyiming

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF1025B Weakened Common Divisor相关的知识,希望对你有一定的参考价值。

思路:

首先选取任意一对数(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
", *st.begin());
43     }
44     return 0;
45 }

 

以上是关于CF1025B Weakened Common Divisor的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces 1025B Weakened Common Divisor(思维)

CodeForces - 1025B Weakened Common Divisor

codeforces 1025B Weakened Common Divisor(质因数分解)

Codeforces #505(div1+div2) B Weakened Common Divisor

CF1271E Common Number

[CF49E]Common ancestor