同余最短路
一个似乎应用比较窄的技巧,用来解决形如“一堆数选至少 \(0\) 个凑出……”的问题。
它的最终转移类似于 \(f((x+a_i)\bmod p)\gets f(x)+x\),其中 \(|\{a\}|\) 是近乎 \(\mathcal O(1)\) 级别的。换句话说,我们利用同剩余系的美好性质,用一个状态维护整个剩余系,用答案维护需要的信息。
P2371 [国家集训队] 墨墨的等式
一类能凑出多少个的问题。
我们先掰掉一个,考虑剩下 \(n-1\) 个能凑出的最小的 \(x\equiv k\pmod {a_1}\),那么整个余数为 \(k\) 的剩余系中 \(\ge x\) 的部分肯定全部拿下了。
于是考虑怎么计算这个最小的 \(x\)。不妨设 \(d_i\) 表示 \(d_i\equiv i\pmod {a_1}\) 的最小 \(d_i\)。那么考虑这类似一个最短路问题,我们可以从 \(x\bmod a_1\) 通过选一次 \(a_y\) 走向 \((x+a_y)\bmod a_1\)。显然从 \(0\) 开始的单源最短路就是 \(d_i\)。
[ABC077D] Small Multiple
考虑我们就是要让 \(x\equiv 0\pmod K\) 的 \(x\) 的数位和最小。这使得我们联想到同余最短路。
图论建模问题,通常我们要思考如何生成所有状态。考虑从 \(1\) 开始任何一个十进制数都可以用若干次 \(\times 10\) 和若干次 \(+1\) 取得(类似的技巧同样用在了 [ARC050C] LCM 111 中,用于不用逆元地计算 \(\frac{10^a-1}{10^b-1}\)),所以我们可以据此连边,只有 \(+1\) 的边计算权重,然后跑一遍最短路。

浙公网安备 33010602011771号