主要内容
形如:
-
设问 \(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}\) !