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 long long LL;
 5 LL gcd(LL a,LL b){
 6     return b==0?a:gcd(b,a%b);
 7 }
 8
 9 const int N=2e5+10;
10 LL a[N],b[N];
11
12 int main(){
13     int n;
14     scanf("%d",&n);
15     LL c=0;
16     for(int i=1;i<=n;i++){
17         scanf("%lld%lld",&a[i],&b[i]);
18         c=gcd(c,a[i]*b[i]);
19     }
20     if(c==1) printf("-1\n");
21     else{
22         for(int i=1;i<=n;i++){
23             LL tmp=gcd(c,a[i]);
24             if(tmp>1) c=tmp;
25             tmp=gcd(c,b[i]);
26             if(tmp>1) c=tmp;
27         }
28         printf("%lld\n",c);
29     }
30     return 0;
31 }

原文地址:https://www.cnblogs.com/ehanla/p/9507688.html

时间: 2024-11-06 11:41:11

Codeforces 1025B Weakened Common Divisor(思维)的相关文章

CodeForces - 1025B Weakened Common Divisor

http://codeforces.com/problemset/problem/1025/B 大意:n对数对(ai,bi),求任意一个数满足是所有数对中至少一个数的因子(大于1) 分析: 首先求所有数对的lcm,把所有数的素因子提出来 求所有lcm的gcd,这样做求出数对之间的公共素因子gcd 注意,公共素因子可能在某一组数对中状态为某一部分是ai的素因子而剩下的一部分是bi的素因子,这种情况导致gcd既不是ai的因子又不是bi的因子,因此必须只保留下aibi公共的素因子,剔除非公共素因子,故

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

codeforces 848B Rooter&#39;s Song 思维题

http://codeforces.com/problemset/problem/848/B 给定一个二维坐标系,点从横轴或纵轴垂直于发射的坐标轴射入(0,0)-(w,h)的矩形空间.给出点发射的坐标轴,位置,延迟时间,发生碰撞则交换方向.求最后每个点的射出位置. 首先我们观察能得出两个结论,1. 类似蚂蚁爬树枝的问题,相遇只会交换方向,所以最后的射出点集只会因为碰撞而改变动点与射出点的对应关系,而不会增加减少射出点集.2.我们根据其射入位置和延迟时间可以计算出一个值v=pos-time,只有这

Codeforces 722C(并查集 + 思维)

题目链接:http://codeforces.com/problemset/problem/722/C 思路: 题目给的操作数从第 1 个到第 N 个数是删除原数组中的一个数, 那么反过来从后往前就是增加原数组中的一个数, 每增加一个值, 那么就有四种情况: 第一种和前后都不连续, 即自成一个集合; 第二种:和前面的数连续, 即和前一个数在一个集合; 第三种和之后一个数连续, 即和之后的一个数在一个集合; 第四种既和前面一个数连续也和后面一个数连续,那么说明前后两个集合被这个数合并成一个集合.

Educational Codeforces Round 26 D dp,思维

Educational Codeforces Round 26 D. Round Subset 题意:有 n 个数,从中选出 k 个数,要使这 k 个数的乘积末尾的 0 的数量最多. tags:dp好题 dp[i][j][l] 表示前 i 个数,选取了其中 j 个数,分解因子后有 l 个 5时,最多有多少个 2 .i 这一维明显可以省略. 这题一开始有个地方写挫了..选取 j 个数时,应该反着来,即 for( j, k, 1) ,不是 for( j, 1, k) ,不然会多算. #include

CodeForces 494A Treasure(字符串匹配 思维)

http://codeforces.com/problemset/problem/494/A 题意 有一串字符串由 ( ) # 组成 #代表若干个 ) 问#具体为多少时可以使每个( 都对应一个 ) 思路 由于可以有多种方式组合 可以默认前 cnt-1 个 #号 与它前一个 ( 匹配 之后再对最后一个#进行特判(分别判断 #右边的num1 和左边的num2 如果num2-num1>0 则满足) #include<cstdio> #include<cstring> #includ