1. 程式人生 > >Codeforces1025B.Weakened Common Divisor

Codeforces1025B.Weakened Common Divisor

題目大意:給出n對數字,要求求一個數,使得這個數是每對數中至少一個數的因子,題目可能出現多個符合要求的數,所以輸出一個符合的數就行了。

思路:將第一對數字a,b單獨拿出來,對其之後輸入的數字對(x,y)的積x*y用__gcd()求他們的最大公因子,並將結果重新覆蓋a,b,最後,因為我們是對x*y與a或b求的最大公因子,為了防止出現因子恰好分別出現在x與y中,而x*y卻恰好是a或b的倍數的情況出現,我們最後再求一次其最小因子。

程式碼:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
typedef long long ll;
using namespace std;

ll f(ll k)
{
    for(int i = 2; i <= sqrt(k);i++)
    {
        if(k % i == 0)return i;
    }
    return k;
}
int main()
{
    ll n,a,b,x,y;
    cin>>n>>a>>b;
    for(int i = 1; i < n; i++)
    {
        cin>>x>>y;
        a = __gcd(x*y,a);
        b = __gcd(x*y,b);
    }
    if(max(a,b)==1)
    {
        cout<<"-1"<<endl;
    }else{
        ll k;
        k = f(max(a,b));
        cout<<k<<endl;
    }
    return 0;
}