同余最短路
主要内容
形如:
- 设问 \(1\) :给定 \(n\) 个整数,求这 \(n\) 个整数在 \(h(h\le2^{63}-1)\) 范围内 能拼凑出多少的其他整数(整数可以重复取) 。
- 设问 \(2\) :给定 \(n\) 个整数,求这 \(n\) 个整数 不能拼凑出的最小(最大)的整数 。
的问题可以使用 同余最短路 的方法 。
同余最短路利用同余来构造一些状态,可以达到 优化空间复杂度 的目的。
解决方案
设 \(x\) 为 \(n\) 个数中最小的一个,令 \(ds[i]\) 为只通过增加其他 \(n-1\) 种数能够达到的最低楼层 \(p\) ,并且满足 \(p\equiv i\pmod{x}\) 。
对于 \(n-1\) 个数与 \(x\) 个 \(ds[i]\) ,可以如下连边:
for(int i=0;i<x;i++) for(int j=2;j<=n;j++) add(i,(i+a[j])%x,a[j]);
之后进行最短路 ,对于 :
- 设问 \(1\) :( 如 P3403 跳楼机 、P2371 [国家集训队]墨墨的等式 ) 答案为:(加一因为 \(i\) 本身也要计算)
\[\sum_{i=0}^{x-1}{[d[i]\le h]\times\dfrac{h-d[i]}{x}+1}
\]
- 设问 \(2\) :( 如 P2662 牛场围栏 ) 答案为:( \(i\) 一定时最小表示的数为 \(d[i]=s\times x+i\) ,则 \((s-1)\times x+i\) 一定不能 被表示出来 )
\[\min_{i=1}^{x-1}{\{d[i]-x\}}
\]
注意:\(ds\) 与 \(h\) 范围相同,一般也要开 \(\operatorname{long}~\operatorname{long}\) !
其他例题
CF516E Drazil and His Happy Friends
发现只有对 \(\gcd(n,m)\) 取模相同的那些数才可能互相到达,不妨将他们按照余数分开处理。对男生全部完成、女生全部完成的最大时间取 \(\max\) 就是当前余数的最大时间。
以求出女生最大时间为例,设当前余数下有 \(n\) 个男生,\(m\) 个女生。
- 如果第 \(i\) 个男生是快乐的,那么在 \(i\) 时间会让编号为 \(i\bmod m\) 的女生变得快乐;在经过 \(n\) 时间后,他会让编号为 \((i+n)\bmod m\) 的时间变得快乐;经过 \(kn\) 时间后,会让编号为 \((i+kn)\bmod m\) 的女生变得快乐……
- 不妨考虑在女生之间转移,如果 \(i\) 号女生当前是快乐的,她可以通过男生在 \(n\) 时间后让编号为 \((i+n)\bmod m\) 的女生变得快乐,这样如果按照 \(i\Rightarrow (i+n)\bmod m\) 的顺序不断传递,所有女生都会连接成一个大环,以 \(n\) 时间为周期依次将下一个女生变得快乐。最后一个变得快乐的女生就是最大时间。
由于 \(n,m\) 的范围高达 \(10^9\),肯定不能够真的将上面的大环建出来,考虑用数学意义完成:
\[i\Rightarrow (i+n)\mod m\\
\dfrac{i}{n}\times n\Rightarrow \dfrac{i+n}{n}\times n\mod m\\
\dfrac{i}{n}\times n\Rightarrow \left(\dfrac{i}{n}+1\right)\times n\mod m
\]
但是其中的除法怎么做?exgcd
!!在按照 \(\gcd{n,m}\) 余数分类后,除去 \(\gcd\) 因子,可以求出 \(n,m\) 互相的逆元,满足 \(nx\equiv 1\pmod{m},my\equiv 1\pmod{n}\)。
这样就可以根据 \(\frac{i}{n}\) 快速对 \(m\) 中有用的女生排序,相邻两个女生就是环上最接近的两个有用的女生。在其中循环一遍求出最大时间即可。