$\Large\mathcal{Problem}$
$\qquad$ 给定一个 $a$ 数组,问在 $[l, r]$ 范围内,有多少个 $k$ 满足 $\sum\limits_{i=1}^n a_i \times x_i = k$ 存在非负整数解。
$\Large\mathcal{Solution}$
$\qquad$ 在 $l, r$ 比较小的情况下,我们可以用完全背包来实现。
$\qquad$ 但在 $l, r$ 超出 $int$ 范围时,即使用 $bitset$ 优化后的完全背包也难以通过。
$\qquad$ 这时候就要用上我们的主角 $—$ 同余最短路
$\Large\texttt{实现}$
$\qquad$ 我们令 $Base$ 为某一个 $a_i$。
$\qquad$ $f_i$ 表示满足条件且 $mod$ $Base$ $=$ $i$ 的最小的数
$\qquad$ 那么 $k$ 满足条件当且仅当 $k \ge f_{k \% Base}$
$\qquad$ 建边的话就对于 $i \in [0, Base - 1]$ 向 $(i + a_j)$ $\%$ $Base$ 连一条长度为 $a_j$ 的边。
$\qquad$ (可以发现,边数的多少是依托于点数的多少的,因此 $Base$ 选用 $\min\limits_{i = 1}^n a_i$ 时最优)
$\qquad$ 然后就直接跑最短路即可。
$\qquad$ 据说,由于这种建边方式,$SPFA$ 不会被卡
$\Large\texttt{模板}$
$\qquad$ $luogu$ $P3403$ 跳楼机
$\qquad$ 给定 $a, b, c, h$, 问在 $[0, h - 1]$ 范围内,有多少个 $k$ 满足 $ax + by + cz = k$ 存在非负整数解。
1 |
|