同余最短路小记
前几天 mns 的时候遇到被卡科技了,然后垫底了(
虽说是个极其简单的东西,但是出于学一个算法必须要写学习笔记的强迫症,还是写几行字吧。
考虑问题:给定正整数 \(a_{1\sim n}\),有哪些非负整数能被 \(a_{1\sim n}\) 由非负整数权线性表出。\(n=2\) exgcd?完全背包?
我们发现若 \(x\) 可以,则 \(x+ka_1(k\in\N)\) 也可以。于是我们可以对每个 \(\bmod a_1\) 的同余类求出最小的能被线性表出的 \(x\)。容易想到,我们可以给 \(0\sim a_1 - 1\) 各设一个点,对 \(i\in[2, n]\) 连边 \(x\to (x+a_i)\bmod a_1\) 边权为 \(a_i\),跑最短路,显然 \(dis_i\) 就是 \(\bmod a_1=i\) 的最小的能被线性表出的数。
边数 \(a_1n\),可以把最小值放到 \(a_1\) 的位置。dijkstra 一般跑不满同余最短路的图,1e7 一般能跑。没了。
珍爱生命,远离抄袭!