codeforces505B (思维)

本文介绍了一个算法问题:判断是否存在一个质数作为每组数对中至少一个数的因子。通过预处理质数并检查每组数对来解决该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值