生成函数 + $NTT$ .
设这个数列做了 $i$ 次前缀和后的生成函数为 $F_i(x)$ . $F_0(x)$ 是已知的,将下标置为从 $0$ 开始.
考虑如何递推,令 $G(x)=\sum_{i=0}^{n-1}x^i$ ,则
$$
F_{i+1}(x)\equiv F_i(x)\cdot G(x)\ (\mbox{mod}\ x^n)
$$
那么就有
$$
F_k(x)\equiv F_0(x)\cdot G^k(x)\ (\mbox{mod}\ x^n)
$$
直接用多项式快速幂,时间复杂度 $O(n\log n)$ .但这种做法常数比较大,而且写起来麻烦.
考虑 $G(x)^k$ 的组合意义.有 $k$ 个盒子,每个盒子可以拿出 $0\sim n-1$ 个球, $[x^i]G^k(x)$ 表示拿出了 $i$ 个球的方案数.
盒子是不同的,而球是相同的,相当于把这 $i$ 个球分到 $k$ 个盒子里去.隔板法可知 $[x^i]G^k(x)={i+k-1\choose k-1}$ .
用 $NTT$ 将 $F_0(x)$ 和 $G^k(x)$ 乘起来就是答案了.时间复杂度 $O(n\log n)$ ,是与 $k$ 无关的.
1 |
|