CodeForces - 1025B Weakened Common Divisor

http://codeforces.com/problemset/problem/1025/B

大意:n对数对(ai,bi),求任意一个数满足是所有数对中至少一个数的因子(大于1)

分析:

  1. 首先求所有数对的lcm,把所有数的素因子提出来
  2. 求所有lcm的gcd,这样做求出数对之间的公共素因子gcd
  3. 注意,公共素因子可能在某一组数对中状态为某一部分是ai的素因子而剩下的一部分是bi的素因子,这种情况导致gcd既不是ai的因子又不是bi的因子,因此必须只保留下aibi公共的素因子,剔除非公共素因子,故只需执行gcd=__gcd(ai,gcd),gcd=__gcd(bi,gcd)(注意,需先判断__gcd(xi,gcd)>1)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=150000+100;
ll a[MAXN],b[MAXN];

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%lld %lld",&a[i],&b[i]);
    ll gcd=a[0]*b[0]/__gcd(a[0],b[0]);
    for(int i=1;i<n;i++)
        gcd=__gcd(gcd,a[i]*b[i]/__gcd(a[i],b[i]));
    if(gcd==1)
    {
        printf("-1\n");
        return 0;
    }
    ll temp;
    for(int i=0;i<n;i++)
    {
        temp=__gcd(gcd,a[i]);
        if(temp>1){
            gcd=temp;
            continue;
        }
        temp=__gcd(gcd,b[i]);
        if(temp>1)
            gcd=temp;
    }
    printf("%lld\n",gcd);
    return 0;
}

原文地址:https://www.cnblogs.com/spzeno/p/10467084.html

时间: 2024-10-29 16:18:51

CodeForces - 1025B Weakened Common Divisor的相关文章

Codeforces 1025B Weakened Common Divisor(思维)

题目链接:CF 1025B 题意:给定n个二元组(ai,bi),定义WCD为能整除n个二元组每组中至少一个的数,求WCD. 题解:我们先求出能整除n个二元组ai*bi的GCD(代表了ai和bi两者),如果得到的GCD!=1,我们再对这n个二元组去提取,GCD与ai和bi进行gcd,可以认为是一个缩化,如果为1代表我们实际去求答案的时候不选择该数:否则说明无法找到这样的值,输出-1. 1 #include <cstdio> 2 using namespace std; 3 4 typedef l

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

题意: 给你n对数,求一个数,可以让他整除每一对数的其中一个 思路: 枚举第一对数的质因数,然后暴力 代码: #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<string> #include<stack> #include<queue> #include<d

【Codeforces Round #505 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) B】Weakened Common Divisor

[链接] 我是链接,点我呀:) [题意] 给你n个数对(ai,bi). 让你求一个大于1的数字x 使得对于任意的i x|a[i] 或者 x|b[i] [题解] 求出第一个数对的两个数他们有哪些质因子. 显然用这些质因子去试2..n就可以了. 看哪个可以满足 就输出对应的就可以了. (一开始我求出这个数的所有因子(TLE了)..其实没有必要...因为假设y是x的倍数..然后y满足的话,显然x也能满足要求..所以只要用质因子搞就行了. [代码] #include <bits/stdc++.h> #

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

题意:给你若干个数对,每个数对中可以选择一个个元素,问是否存在一种选择,使得这些数的GCD大于1? 思路:可以把每个数对的元素乘起来,然后求gcd,这样可以直接把所有元素中可能的GCD求出来,从小到大枚举即可,需要特判一下第一个元素是素数的情况. #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #include<map> #include<s

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<in

LeetCode.1071-字符串最大公约数(Greatest Common Divisor of Strings)

这是小川的第391次更新,第421篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第253题(顺位题号是1071).对于字符串S和T,当且仅当S = T + ... + T(T与自身连接1次或更多次)时,我们说"T除S". 返回最大的字符串X,使得X除以str1,X除以str2. 例如: 输入:str1 ="ABCABC",str2 ="ABC" 输出:"ABC" 输入:str1 ="AB

Codeforces Round #505 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) -B C(GCD,最长连续交替序列)

B. Weakened Common Divisor time limit per test 1.5 seconds memory limit per test 256 megabytes input standard input output standard output During the research on properties of the greatest common divisor (GCD) of a set of numbers, Ildar, a famous mat

Codeforces Round #505 (Div 1 + Div 2 Combined) Partial Solution

从这里开始 题目列表 瞎扯 Problem A Doggo Recoloring Problem B Weakened Common Divisor Problem C Plasticine zebra Problem D Recovering BST Problem E Colored Cubes Problem F Disjoint Triangles Problem G Company Acquisitions 瞎扯 打比赛,发现自己特别菜. 居然还苟且水上紫名 这个号不敢玩了.要努力学习

Codeforces Round #505 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)

A : A. Doggo Recoloring time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Panic is rising in the committee for doggo standardization — the puppies of the new brood have been born multi-colore