Линейное диофантово уравнение - нахождение количества решений и решений в заданном интервале

Я изучаю линейное диофантово уравнение по алгоритму cp. В целом я понял теорию. Но столкнулся с проблемой в реализации.

Помогите мне, предоставив тестовый пример, в котором выполняются и shift_solution(x, y, a, b, (minx - x) / b);, и shift_solution(x, y, a, b, sign_b);. Я пробовал некоторые уравнения, но в каждом случае после выполнения shift_solution(x, y, a, b, (minx - x) / b); x becomes equal to minx. По сути, мне нужен тестовый пример, который будет выполнять обе строки.

shift_solution(x, y, a, b, (minx - x) / b);
    if (x < minx)
        shift_solution(x, y, a, b, sign_b);
    if (x > maxx)
        return 0;
    int lx1 = x;

Вот пример кода из ref:

void shift_solution(int & x, int & y, int a, int b, int cnt) {
    x += cnt * b;
    y -= cnt * a;
}

int find_all_solutions(int a, int b, int c, int minx, int maxx, int miny, int maxy) {
    int x, y, g;
    if (!find_any_solution(a, b, c, x, y, g))
        return 0;
    a /= g;
    b /= g;

    int sign_a = a > 0 ? +1 : -1;
    int sign_b = b > 0 ? +1 : -1;

    shift_solution(x, y, a, b, (minx - x) / b);
    if (x < minx)
        shift_solution(x, y, a, b, sign_b);
    if (x > maxx)
        return 0;
    int lx1 = x;

    shift_solution(x, y, a, b, (maxx - x) / b);
    if (x > maxx)
        shift_solution(x, y, a, b, -sign_b);
    int rx1 = x;

    shift_solution(x, y, a, b, -(miny - y) / a);
    if (y < miny)
        shift_solution(x, y, a, b, -sign_a);
    if (y > maxy)
        return 0;
    int lx2 = x;

    shift_solution(x, y, a, b, -(maxy - y) / a);
    if (y > maxy)
        shift_solution(x, y, a, b, sign_a);
    int rx2 = x;

    if (lx2 > rx2)
        swap(lx2, rx2);
    int lx = max(lx1, lx2);
    int rx = min(rx1, rx2);

    if (lx > rx)
        return 0;
    return (rx - lx) / abs(b) + 1;
}

person Chakma    schedule 04.07.2020    source источник
comment
На ваш вопрос был дан ответ здесь.   -  person Smap    schedule 06.10.2020


Ответы (1)


Если x ‹ minix, то первый вызов функции итерирует его до ближайшего возможного x к mini и x меньше, чем mini, поэтому нам нужно добавить еще одно b здесь.

person Fatih Solak    schedule 14.10.2020