【题目】http://codeforces.com/contest/1025/problem/B
【题意】给出n对数,问是否存在一个数,使得每对数都至少有一个能整除这个数。
【思路】枚举出第一对数所有的质因子,再枚举每一对数看看能不能整除。
【代码】
#include<bits/stdc++.h>
#define fuck(x) std::cout<<"["<<#x<<"->"<<x<<"]"<<endl;
using namespace std;
pair<int,int>p[150005];
int main()
{
int n;
scanf("%d",&n);
for(int i=0; i<n; i++)
{
scanf("%d%d",&p[i].first,&p[i].second);
}
set<int>s;
//----将第一对数的所有*质因子*放进set----begin
//----求质因子----start
int x=p[0].first;
for(int j=2; j<=sqrt(x); j++)
{
while(x%j==0)
{
s.insert(j);
x/=j;
}
}
if(x>1)
s.insert(x);
//----求质因子----end
//----求质因子----start
x=p[0].second;
for(int j=2; j<=sqrt(x); j++)//此x非彼x,在循环中x被改变了。
{
while(x%j==0)//将x里的j全部除掉
{
s.insert(j);
x/=j;
}
}
if(x>1)
s.insert(x);//不要落下
//----求质因子----start
//----将第一对数的所有*质因子*放进set----end
//取出存在set里的每一个因子,
//判断是否能整除每个pair里的至少一个数↓
int ans=-1;
for(auto x:s)
{
int flag=0;
for(int i=0; i<n; i++)
{
if(p[i].first%x!=0&&p[i].second%x!=0)
{
flag=1;
break;
}
}
if(flag==0)
{
ans=x;
break;
}
}
printf("%d\n",ans);
}