(a1,b2) (a2, b2)....这样的数对有n对,问是否存在一个数,使得这个数是每个数对中至少一个数的因子。
我一开始贪心被hack了。。后来又想枚举一个数的所有因子,a[i]太大了放弃。。比赛结束后看别人代码才知道只需要枚举质因子就行了。。而int内的数的质因子不超过十个。。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int mx = 1500005;
int prime[mx], vis[mx], cnt = 0;
int A[mx], B[mx], n;
void init() {
memset(vis, 0, sizeof(vis));
for (long long i = 2; i <= 1500000; i++) {
//if (i % 1000 == 0 || i >= 46000) printf("i = %d\n", i);
if (!vis[i]) {
prime[cnt++] = i;
for (long long j = i*i; j <= 150000; j+=i)
vis[j] = 1;
}
}
}
bool judge(int p) {
for (int i = 2; i <= n; i++) {
if (A[i] % p != 0 && B[i] % p != 0)
return false;
}
return true;
}
int main() {
init();
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d%d", &A[i], &B[i]);
}
int ans = -1;
for (int i = 0; i < cnt; i++) {
//printf("A = %d B = %d\n", A[1], B[1]);
if (A[1] > 1 && A[1] % prime[i] == 0) {
if (judge(prime[i])) {
ans = prime[i];
break;
}
while (A[1] % prime[i] == 0) A[1] /= prime[i];
}
if (B[1] > 1 && B[1] % prime[i] == 0) {
if (judge(prime[i])) {
ans = prime[i];
break;
}
while (B[1] % prime[i] == 0) B[1] /= prime[i];
}
}
if (A[1] > 1)
if (judge(A[1]))
ans = A[1];
if (B[1] > 1)
if (judge(B[1]))
ans = B[1];
printf("%d\n", ans);
return 0;
}