多次询问组合数前缀和
是一个经典问题,但是似乎大家写的都不太详细……
多次询问 \(n,m\)。
-
\(O(n\sqrt{n})\),莫队,\(n,m\) 变化量为 \(1\) 时的贡献是简单的,\(O(1)\) 转移。
-
\(O(n\log^3 n)\),考虑 \(\binom{n}{i}=\frac{n^{\underline{i}}}{i!}\) 是关于 \(n\) 的 \(i\) 次多项式,那么 \(S(x,m)\) 也是关于 \(n\) 的 \(i\) 次多项式 \(S_m(x)=\sum_{i=0}^{m}\prod_{j=0}^{i-1}\frac{x-j}{j+1}\),带入 \(n\) 的过程即多点求值。
但是并没有优化复杂度,因为 \(S_m(x)\) 次数有 \(m\),显然不能暴力对每个 \(m\) 多点求值。考虑 \(F_{l,r}(x)=\sum_{i=l}^{r}\prod_{j=l}^{i-1}\frac{x-j}{j+1}\) 和 \(G_{l,r}(x)=\prod_{j=l}^{r}\frac{x-j}{j+1}\),放在线段树上维护,合并有 \(F_{l,r}(x)=F_{l,mid}(x)+G_{l,mid}(x)F_{mid+1,r}(x),G_{l,r}(x)=G_{l,mid}(x)G_{mid+1,r}(x)\)。每个询问被分到 \(O(\log n)\) 个多项式上边,即 \(S_m(x)=\sum_{[l_i,r_i]\in b(m)}F_{l_i,r_i}(x)\prod_{[l_j,r_j]\in b(l_i-1)}G_{l_j,r_j}(x)\)(\(b(n)\) 表示把 \(n\) 分到线段树上的区间集合,\(F\) 和 \(G\) 一共有 \(O(\log n)\) 个),对线段树上每个区间多点求值后就能合并了。 -
\(O(n\log^2 n)\),对于每个区间多点求值有点鸡肋,考虑多点求值的过程:每次 \(\bmod\) 上 \(\prod_{l\leq i\leq r}(x-n_i)\) 后分治下去,那么直接在线段树上模拟这个过程。对于每个区间多维护 \(P_{l,r}(x)\) 表示 \(\sum_{[l_i,r_i]\in b(l-1)}F_{l_i,r_i}(x)\prod_{[l_j,r_j]\in b(l_i-1)}G_{l_j,r_j}(x)\) (取模的结果)和 \(Q_{l,r}(x)\) 表示 \(\prod_{[l_j,r_j]\in b(l-1)}G_{l_j,r_j}(x)\)(取模的结果),具体转移过程就是 \(Q_{l,mid}\gets Q_{l,r},Q_{mid+1,r}\gets Q_{l,r}G_{l,mid},P_{l,mid}\gets P_{l,r},P_{mid+1,r}\gets P_{l,r}+Q_{l,r}F_{l,mid}\)(都是取模乘法),叶节点的 \(P\) 就是答案。