​传送门​

题目大意

给出n对数,问是否存在一个数,使得没对数都能找出至少一个数的因子包含该数。

思路

找到第一对数所有的质因子,暴力查找其他组有没有即可
…好像写麻烦了…

代码

bool vis[maxn];//标记非素数,0是素数
int primer[maxn/10];//存素数
int cnt=0;//记录素数个数,
void find_primer(){
for(int i=2;i <=maxn;i++){
if(!vis[i])primer[cnt++]=i;
for(int j=0;j<cnt&&primer[j]*i<=maxn;j++){
vis[i*primer[j]]=1;//筛
if(i%primer[j]==0)break;//关键!!!找到i*primer[j]的最小质因子primer[j],退出
}
}
}

set<ll> s;

void init(ll x,ll y){
for(int i=0;i<cnt&&primer[i]*primer[i]<=x;i++){
if(x%primer[i]==0){
while(x%primer[i]==0){
x/=primer[i];
}
s.insert(primer[i]);
}
}
if(x>1) s.insert(x);
for(int i=0;i<cnt&&primer[i]*primer[i]<=y;i++){
if(y%primer[i]==0){
while(y%primer[i]==0){
y/=primer[i];
}
s.insert(primer[i]);
}
}
if(y>1) s.insert(y);
}
ll x[maxn],y[maxn];
int main(){
int n;
cin>>n;
find_primer();
for(int i=1;i<=n;i++){
scanf("%lld%lld",&x[i],&y[i]);

}

init(x[1],y[1]);
int flag=1;
ll ans;
set<ll>::iterator it; //定义前向迭代器
//中序遍历集合中的所有元素
for(it=s.begin();it!=s.end();it++){
int flag1=1;
for(int j=1;j<=n;j++){
if(x[j]%(*it)!=0&&y[j]%(*it)!=0){
flag1=0;
break;
}
}
if(flag1==1){
flag=0;
ans=(*it);
}
}
if(flag==1){
puts("-1");
}
else{
printf("%lld\n",ans);
}
}