CodeForces 75C Modified GCD 【二分+数论】

本文介绍了一种高效算法,用于寻找两个整数的最大公约数的所有因数,并判断这些因数是否位于给定区间内。使用C++和Python实现,通过求最大公约数并遍历所有可能的因数,利用二分搜索快速定位合适的因数。

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

题目链接


先求出a和b的最大公约数,找出其所有的因数——sqrt(n)的复杂度,涨姿势了。

然后就是判断所有的因数有没有落在low,high区间里面了——二分即可(upper_bound)


C++版本:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
typedef long long ll;
vector<int> x;
int low, high, a, b, n, m, ans;

int main() {
    scanf("%d%d", &a, &b);
    a = __gcd(a, b);
    b = sqrt(a);
    x.clear();
    for (int i=1; i<=b; i++)
        if (a % i == 0) {
            x.push_back(i);
            x.push_back(a/i);
        }
    sort(x.begin(), x.end());
    scanf("%d", &n);
    for (int i=0; i<n; i++) {
        scanf("%d%d", &low, &high);
        m = upper_bound(x.begin(), x.end(), high) - x.begin() - 1;
        ans = x[m];
        if (low > ans) puts("-1");
        else printf("%d\n", ans);
    }

    return 0;
}

Python版本:

from fractions import gcd
from bisect import bisect_right as br 
g = gcd(*map(int, raw_input().split()))
i = 1
r = []
while i*i <= g:
    if g % i == 0:
        r.append(i)
        r.append(g/i)
    i += 1
r = sorted(r)

for i in xrange(input()):
    l, h = map(int, raw_input().split())
    m = r[br(r, h)-1]
    print -1 if m < l else m

    


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值