Topic link: http://codeforces.com/problemset/problem/1025/B
Give you n logarithms, and ask for one of each pair of numbers to form an array of length n. Let these numbers have common factors.
Because all the factors of a number can be combined with their prime factors, the decomposition prime factors are considered.
The first two digits are decomposed into prime factors and added to set. Then for each array traverse set, if it can not divide the current element, it will be deleted.
Finally, see if the set is empty.
#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; }