Codeforces #505(div1+div2) B Weakened Common Divisor
Posted pkgunboat
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces #505(div1+div2) B Weakened Common Divisor相关的知识,希望对你有一定的参考价值。
题意:给你若干个数对,每个数对中可以选择一个个元素,问是否存在一种选择,使得这些数的GCD大于1?
思路:可以把每个数对的元素乘起来,然后求gcd,这样可以直接把所有元素中可能的GCD求出来,从小到大枚举即可,需要特判一下第一个元素是素数的情况。
#include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #include<map> #include<set> #include<bitset> #include<map> #include<queue> #include<cmath> #include<stack> #include<vector> #define INF 0x3f3f3f3f #define pii pair<int,int> #define LL long long #define mk(a,b) make_pair(a,b) #define rep(i,n) for(int i=1;i<=n;i++) using namespace std; LL a[200010][2]; inline LL gcd(LL x,LL y){ return y?gcd(y,x%y):x; } int main(){ int n; scanf("%d",&n); LL sum=0,ans=0; for(int i=1;i<=n;i++){ scanf("%lld%lld",&a[i][0],&a[i][1]); sum=gcd(a[i][0]*a[i][1],sum); } if(sum==1){ printf("-1 "); return 0; } for(int i=2;i*i<=a[1][0];i++){ if(ans==0&&sum%i==0)ans=i; while(a[1][0]%i==0)a[1][0]/=i; } if(ans==0&&a[1][0]>1&&sum%a[1][0]==0)ans=a[1][0]; for(int i=2;i*i<=a[1][1];i++){ if(ans==0&&sum%i==0)ans=i; while(a[1][1]%i==0)a[1][1]/=i; } if(ans==0&&a[1][1]>1&&sum%a[1][1]==0)ans=a[1][1]; printf("%lld ",ans); }
以上是关于Codeforces #505(div1+div2) B Weakened Common Divisor的主要内容,如果未能解决你的问题,请参考以下文章
CodeForces875C[拓扑排序] Codeforces Round #440 [DIV2E/DIV1C]
codeforces AIM Tec round 5(div1+div2) C. Rectangles
Codeforces #504(div1+div2) 1023D Array Restoration(线段树)