版权声明:本文为博主原创文章,转载请附上原博客链接。 https://blog.csdn.net/Dale_zero/article/details/81911970
题目链接:http://codeforces.com/problemset/problem/1025/B
给你n对数,要求在每一对数字中选一个,形成一个长度为n的数组。使得这些数有公共的因数。
因为一个数的所有因数都可以用其质因数组合出来,所以考虑分解质因数。
将第一组的两个数分解质因数,加到set中。之后对于每一组数遍历set,若都不能整除当前元素,即将其删除。
最后看set是否为空即可
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define mod 1000000007
#define For(i,m,n) for(int i=m;i<=n;i++)
#define Dor(i,m,n) for(int i=m;i>=n;i--)
#define LL long long
#define lan(a,b) memset(a,b,sizeof(a))
#define sqr(a) a*a
using namespace std;
set<int> s;
int n;
int pin()
{
int flag=0;
int p,q;
For(k,1,n)
{
scanf("%d%d",&p,&q);
if(k==1)
{
int tem=max(p,q);
int i=2;
int p1=p,q1=q;
while(sqrt(p1)>=i)
{
if(p%i==0)
{
s.insert(i);
//printf("i=%d\n",i);
while(p%i==0)p/=i;
}
i++;
}
if(p>1)
s.insert(p);
i=2;
while(sqrt(q1)>=i)
{
if(q%i==0)
{
s.insert(i);
while(q%i==0)q/=i;
}
i++;
}
if(q>1)
s.insert(q);
}
else
{
auto c=s.begin();
set<int> ss;
for(;c!=s.end();c++)
{
if(p%(*c)==0||q%(*c)==0)
ss.insert(*c);
}
if(ss.empty())
flag=1;
s=ss;
}
}
if(flag==1)
return -1;
return *(s.begin());
}
int main()
{
while(~scanf("%d",&n))
{
printf("%d\n",pin());
}
return 0;
}