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 }

猜你喜欢

转载自www.cnblogs.com/ehanla/p/9507688.html
今日推荐