Link
题意大概就是求$B_l,B_r$范围内$B$的个数使等式
存在非负整数解。其实转化一下题意也就是
在N种物品中任意选择,物品有一个价值,使得最后的总价值处于给定区间内。
这很显然是一个完全背包,而且是类似于一种模板题,但是这道题的数据范围是$B \leq 10^{12}$,因此这么做显然是不行的,但是我们可以从完全背包的视角出发思考题目。
我们取出最小的$a$为$a_{min}$,并且假设我们现在知道了一种方案,物体的总重为$D[i]$,并且满足,在这两种条件下$D[i]$为最小值。
那么显然,对于任意一个同样满足上述两个条件的总重X,$X \leq D[i]$,并且因为$X ~mod~ a_{min} = D[i] ~mod~ a_{min}$,所以可以知道$X$方案可以由$D[i]$方案加上若干个$a_{min}$得到。
现在我们考虑加入一个物体$Now$,那么有
可以从$d[i] + Now$而来。于是可以考虑从i向$(i + Now) ~mod~ a_{min}$连一条比边权为$Now$的边,而求$D[i]$的最小值也就被转化成了最短路问题。
那么算法就得出来了:
- 首先求一下$a_{min}$的最小值保存下来。
- 跑最短路,预处理出D数组。
- 枚举所有的D,计算mod T = i的数在区间$B_l,B_r$中有多少个。
1 |
|
这种在求解用$\{a_i\}$能组成多少个在$B_l, B_r$范围内的数的问题其实是很经典的图论问题,像这种建图困难,但是最短路很好跑的题目便可以称为是建图题了。