我们知道其生成函数就是 ( 1 ) ( 1 + x ) ⋯ ( 1 + x + ⋯ + x n − 1 ) (1)(1+x)\cdots(1+x+\cdots +x^{n-1}) (1)(1+x)⋯(1+x+⋯+xn−1),即
( 1 − x ) ( 1 − x 2 ) ⋯ ( 1 − x n ) ( 1 − x ) n \frac{(1-x)(1-x^2)\cdots(1-x^n)}{(1-x)^n} (1−x)n(1−x)(1−x2)⋯(1−xn)
现在我们欲求 [ x k ] [x^k] [xk],考虑首先加入哑元 t t t,变为
f ( t ) = ( 1 − t x ) ( 1 − t x 2 ) ⋯ ( 1 − t x n ) / ( 1 − x ) n f(t)=(1-tx)(1-tx^2)\cdots(1-tx^n)/(1-x)^n f(t)=(1−tx)(1−tx2)⋯(1−txn)/(1−x)n
实际上这个东西的系数就叫高斯二项式……不过我们还是展示一下如何推导。我们注意到 f ( t ) f(t) f(t) 有一个重要变式,就是
f ( t x ) = ( 1 − t x 2 ) ( 1 − t x 3 ) ⋯ ( 1 − t x n + 1 ) / ( 1 − x ) n = f ( t ) 1 − t x n + 1 1 − t x \begin{aligned} f(tx) &=(1-tx^2)(1-tx^3)\cdots(1-tx^{n+1})/(1-x)^n\\ &= f(t)\frac{1-tx^{n+1}}{1-tx} \end{aligned} f(tx)=(1−tx2)(1−tx3)⋯(1−txn+1)/(1−x)n=f(t)1−tx1−txn+1
因此有
f ( t x ) ( 1 − t x ) = f ( t ) ( 1 − t x n + 1 ) [ t m ] f ( t x ) ( 1 − t x ) = [ t m ] f ( t ) ( 1 − t x n + 1 ) x m ( f m − f m − 1 ) = f m − x n + 1 f m − 1 ( x n + 1 − x m ) f m − 1 = ( 1 − x m ) f m f m = − x m 1 − x n − m + 1 1 − x m f m − 1 \begin{aligned} f(tx)(1-tx) &= f(t)(1-tx^{n+1})\\ [t^m]f(tx)(1-tx) &= [t^m]f(t)(1-tx^{n+1})\\ x^m(f_m-f_{m-1})&=f_m-x^{n+1}f_{m-1}\\ (x^{n+1}-x^m)f_{m-1}&=(1-x^m)f_m\\ f_m&=-x^m \frac{1-x^{n-m+1}}{1-x^m}f_{m-1} \end{aligned} f(tx)(1−tx)[tm]f(tx)(1−tx)xm(fm−fm−1)(xn+1−xm)fm−1fm=f(t)(1−txn+1)=[tm]f(t)(1−txn+1)=fm−xn+1fm−1=(1−xm)fm=−xm1−xm1−xn−m+1fm−1
注意到 f m f_m fm 是 x m ( m + 1 ) / 2 x^{m(m+1)/2} xm(m+1)/2 的倍数,因此这个求和只需到 O ( k 1 / 2 ) O(k^{1/2}) O(k1/2) 项就停止。复杂度为 O ( k 3 / 2 ) O(k^{3/2}) O(k3/2)。
这种实现在本文发表时显著优于所有分块 DP 做法。