![](/img/trans.png)
[英]Finding solutions to a single linear equation in n variables, or determine that no solution exists
[英]Linear Diophantine Equation - Finding the number of solutions and the solutions in a given interval
我正在從cp algorithm學習線性丟番圖方程。 總的來說,我理解了這個理論。 但我在實施中面臨問題。
通過提供一個測試用例來幫助我,其中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;
}
如果 x < minix 那么第一個 function 調用將它迭代到最接近可能的 x 到 mini 並且 x 小於 mini 以便我們需要在這里再添加一個 b。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.