题意:给你若干个数对,每个数对中可以选择一个个元素,问是否存在一种选择,使得这些数的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\n"); 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\n",ans); }
原文地址:https://www.cnblogs.com/pkgunboat/p/9504011.html
时间: 2024-10-11 17:03:05