同余最短路

一个似乎应用比较窄的技巧,用来解决形如“一堆数选至少 \(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\) 的边计算权重,然后跑一遍最短路。

posted @ 2025-03-31 19:24  Shunpower  阅读(60)  评论(0)    收藏  举报