F 層樓,E 條電梯。電梯 i 到達樓層集合 { y_i + k × x_i | k ≥ 0, y_i + k×x_i ≤ F }。問從樓層 A 能否到達樓層 B(可任意換乘)。
電梯 i, j 能換乘 ⇔ 存在非負整數 k₁, k₂ 使得:
y_i + k₁x_i = y_j + k₂x_j ≤ F
移項得線性不定方程:
x_i·k₁ - x_j·k₂ = y_j - y_i
a = x_i, b = -x_j, c = y_j - y_igcd(a, b) = d,若 c % d ≠ 0 無解(x₀, y₀)k₁ = x₀ + (b/d)t, k₂ = y₀ - (a/d)tk₁ ≥ 0, k₂ ≥ 0, y_i + k₁x_i ≤ F, y_j + k₂x_j ≤ F(A - y_i) % x_i == 0 且 A ≥ y_i,連邊 0→iint exgcd(int a, int b, int &x, int &y) {
if (!b) { x = 1; y = 0; return a; }
int d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
void build2(int i, int j) { // 判斷電梯 i, j 能否換乘
int xx, yy;
int a = x[i], b = -x[j], c = y[j] - y[i];
int d = exgcd(a, b, xx, yy);
if (c % d) return;
// 計算 t 的範圍...
if (down > up) return;
g[i].push_back(j); g[j].push_back(i);
}
ceil/floor 處理浮點邊界本題融合了數論(線性不定方程整數解)、圖論(連通性判斷)與仔細的邊界處理。關鍵洞見是將換乘條件轉化為不定方程,利用通解參數 t 的範圍判斷可行性,而非暴力枚舉樓層。