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

来源:互联网 发布:免费摄像头监控软件 编辑:程序博客网 时间:2024/06/05 16:52

题目链接


先求出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 gcdfrom bisect import bisect_right as br g = gcd(*map(int, raw_input().split()))i = 1r = []while i*i <= g:    if g % i == 0:        r.append(i)        r.append(g/i)    i += 1r = 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