zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Java基础语法
    C语言练习题目
    C语言进阶(1)
    C语言易错点
    SQL语句入门
    C语言算法基础
    C语言算法入门
    嵌入式入门
    C语言基础(3)
    C语言基础(2)
  • 原文地址:https://www.cnblogs.com/wangyiming/p/9512712.html
Copyright © 2011-2022 走看看