同余最短路 学习笔记
当出现形如「给定
同余最短路利用同余来构造一些状态,可以达到优化空间复杂度的目的。
类比 差分约束 方法,利用同余构造的这些状态可以看作单源最短路中的点。同余最短路的状态转移通常是这样的
例题
例题一
不妨假设
令
可以得到两个状态:
注意通常选取一组
那么实际上相当于执行了最短路中的建边操作:
add(i, (i+y) % x, y)
add(i, (i+z) % x, z)
接下来只需要求出
但是事实上也不需要进行正常的最短路求解,注意到有两个特殊的性质:
首先,只有两种边权,且对于每一条路径,由于加法交换律,走两种边权的顺序是无影响的。因此可以考虑做两次最短路,每次只建出一类边权的边;
其次,对于只有一类边权的图,每个点
并且,边权为正,绕环两圈后,一定不能继续松弛。直接循环更新一遍就行了。这样处理就不会受限于最短路的复杂度,可以做到
与差分约束问题相同,当存在一组解
答案即为:
加 1 是由于
代码实现上注意到 long long 的最大值。所以可以使用 unsigned long long 或者先把
例题二
NOTE
ARC084B Small Multiple 题目大意:给定
本题可以使用循环卷积优化完全背包在
观察到任意一个正整数都可以从
对于所有
每个
时间复杂度