多组询问组合数前缀和 | djq 分治

Aleph1022

2023-12-05 14:40:15

Personal

前情提要:社论「不 CDQ 的分治 NTT」(详细揭秘)

问题.

给定 q 组询问,每组询问给定 n, m,求

\sum_{i=1}^m \binom ni

其中各参数同阶(实际上只需要 m, q 同阶)。

我们直接泛化为 \mathbf V_{n, m} = \mathbf V_{n, m-1} \mathbf M_m(n),其中 \mathbf V, \mathbf M 是多项式矩阵(或向量),要对这个递推式多点求值。

这里我们只需令 \mathbf V_{n, m} = \begin{bmatrix}\binom nm & \sum_{i=1}^m \binom ni\end{bmatrix}\mathbf M_m(n) = \begin{bmatrix}\frac{n-m+1}m & \frac{n-m+1}m \\ 0 & 1 \end{bmatrix}

那么问题变为多次查询多项式矩阵列 \mathbf M_k(x) 的某个前缀积的一处点值。熟悉传统的取模多点求值算法的读者,在将问题转化到这一步时就应当容易得到做法:分治取模即可。时间复杂度 O(n\log^2 n)

事实上我们还有规避取模的做法,可以用来减小一点常数。

不妨假设每个前缀恰好需要一处点值,则问题可以描述为

a_m = \prod_{i=1}^m \mathbf M_i(x_m)

M = \max m,考虑一个 1 \times M 的矩阵 \mathbf A_{1m} = \prod_{i=1}^m \mathbf M_i(x_m),从而该问题的转置为:给定序列 a'_m,求

\sum_{m=1}^M a'_m \prod_{i=1}^m \mathbf M_i(x_m)

考虑 F(x_0) = [t^0] \frac{F(1/t)}{1 - x_0 t}。不妨设 \deg \mathbf M_i(t) = 1,那么我们可以考虑计算

[t^M] \sum_{m=1}^M a'_m \frac{t^M \prod_{i=1}^m\mathbf M_i(1/t)}{1-x_m t} = [t^M] \sum_{m=1}^M a'_m \frac{t^{M-m} \prod_{i=1}^m\mathbf M_i^R(t)}{1-x_m t}

其中 F^R(t) 表示将 F(t) 的系数反转。

这样就规避了取模。同时转置后的问题也在一些地方已经出现,例如 CCPC Final 2022 M。