P8367 [LNOI2022] 盒
记 \(a_i\) 前缀和为 \(t_i\),\(t_n=S\),\(b_i\) 前缀和为 \(s_i\)。
套路地拆贡献,我们有[1]
显然我们可以考虑把后面那一坨根据绝对值拆成两部分。
这样的话,我们不妨记
而
我们发现,这并没有什么卵用。
注意不到 \(n\binom{n+m-1}{n}=m\binom{n+m-1}{m}\),这个东西证明没什么好证的。其实可以考虑组合意义
(先咕着)
这样
这是好的,我们只需要考虑怎么计算 \(f(n,m,\cdot,\cdot),f(n+1,m-1,\cdot,\cdot)\) 就可以了。
然而这个表达式并不能被简单表示,虽然它是范德蒙德卷积的形式,但是由于它的循环上界不一样,所以并不能这么做。我们考虑每次修改时的增量。
显然对于 \(j\) 那一维的更改是可以简单计算的,我们考虑怎么计算对 \(i\) 的更改。
我们尝试考虑这个东西的组合意义。它表示一共有 \(n\) 个数,每个数 \(\geq 0\),它们的和是 \(m\),额外要求前 \(i\) 个数的和 \(\leq j\),问方案数。我们上面这个式子相当于是在枚举前 \(i\) 个数的和是多少来进行计算,考虑换一个角度,尝试进行某种意义上的“反演”操作。我们把值域看成 \(m\) 个小球,把位置看成 \(n\) 个盒子。考虑这种“反演”操作,枚举第 \(j+1\) 个球在哪个盒子里,我们有
这时我们可以快速计算 \(i\) 的更改了。
注意到我们的询问都是形如 \(f(n,m,i,t_i)\) 的形式,由于 \(t_i\) 关于 \(i\) 递增,我们可以均摊 \(O(n+S)\) 地解决这个问题。
这个东西其实除了选 n 个 0~m 的数和为 m 插板以外,我想了一个不太对的做法。你考虑有 m+1 个球,标号为 0~m,后面再加 n-1 个球,然后从中选出 n 个来,对第一个而言,数就是它对应的,对于第二个而言,数就是它对应的减1,以此类推。这个做法本质上是考虑原数列的前缀和数列,但问题出在它没有限制最后一个位置是 m,限制之后它也是对的。 ↩︎

浙公网安备 33010602011771号