读完题目,马上想到的就是01背包,n 种物品无限个数,看看在范围内能组合出的 B 的个数。无论是时间还是空间都肯定承受不了。
每一个整数 a 都可以写成 k*p+r 的形式。假设 x = min(ai),对于任何一个数字 y,若 y % x = r,则 r + kx = y。倘若 B % x = i,且能组合出的最小的数字 t (t % x = i 且 t 小于等于 B),那么 B 一定可以通过往 t 上叠加若干个 x 得到(可以是0个)。
我们再假设能组合出的最小数字 t,满足 t % a1 = i 记作 dis[i],假设 dis[0~a1-1] 都已经求好了,我们就可以求出 Bmin 到 Bmax 之间所有的可以组合出的B了。首先对于某个边界(设它为H),求出大于dis[H]且不大于H的所有的,对a1取模结果为 i 的数字个数,然后两个作差就好了。