对于函数 f : N → C f:\mathbb{N}\to\mathbb{C} f : N → C ,定义其普通生成函数(OGF)F ( z ) = ∑ i ≥ 0 f ( i ) z i \mathbf{F}(z)=\sum_{i\geq 0} f(i)z^i F ( z ) = ∑ i ≥ 0 f ( i ) z i ,指数生成函数(EGF)F ( z ) ^ = ∑ i ≥ 0 f ( i ) i ! z i \hat{\mathbf{F}(z)}=\sum_{i\geq 0} \frac{f(i)}{i!}z^i F ( z ) ^ = ∑ i ≥ 0 i ! f ( i ) z i 。
我们使用 ⟨ f ( 0 ) , f ( 1 ) , f ( 2 ) , ⋯ ⟩ \langle f(0),f(1),f(2),\cdots \rangle ⟨ f ( 0 ) , f ( 1 ) , f ( 2 ) , ⋯ ⟩ 来表示 f f f 的普通生成函数。
若存在 S ⊆ C S\subseteq \mathbb{C} S ⊆ C 使得 ∀ z ∈ S \forall z\in S ∀ z ∈ S ,生成函数 F ( z ) \mathbf{F}(z) F ( z ) 收敛,此时 F ( z ) \mathbf{F}(z) F ( z ) 若可用有限项函数 g ( z ) g(z) g ( z ) 表示,则称 g ( z ) g(z) g ( z ) 为 F ( z ) \mathbf{F}(z) F ( z ) 的封闭形式。
可以发现大多数生成函数不存在较好的封闭形式,如各种常见生成函数的若干位截断,以及生成函数的 Euler 变换等。
定义 n m ‾ = ∏ i = n − m + 1 n i n^{\underline{m}}=\prod_{i=n-m+1}^{n} i n m = ∏ i = n − m + 1 n i ,读作 n n n 的 m m m 次下降幂(Factorial Power 或 Falling Factorial)。
定义 n m ‾ = ∏ i = n n + m − 1 i n^{\overline{m}}=\prod_{i=n}^{n+m-1}i n m = ∏ i = n n + m − 1 i ,读作 n n n 的 m m m 次上升幂(Pochhammer Symbol 或 Rising Factorial)。
定义广义二项式系数 ( α n ) = 1 n ! α n ‾ \binom{\alpha}{n}=\frac{1}{n!}\alpha^{\underline{n}} ( n α ) = n ! 1 α n ,这样就将组合数推广到了 α ∈ C , n ∈ N \alpha\in\mathbb{C},n\in\mathbb{N} α ∈ C , n ∈ N 。
上指标反转定理:( n m ) = ( − 1 ) m ( n − m − 1 m ) \binom{n}{m}=(-1)^m\binom{n-m-1}{m} ( m n ) = ( − 1 ) m ( m n − m − 1 ) ,常用于处理上指标为负数的情况。
牛顿二项式定理:
( n + m ) α = ∑ i ≥ 0 ( α i ) n i m α − i (n+m)^{\alpha}=\sum_{i\geq 0} \binom{\alpha}{i}n^im^{\alpha-i} ( n + m ) α = i ≥ 0 ∑ ( i α ) n i m α − i
可以发现与二项式定理十分类似。
生成函数的乘法有 [ z n ] ( F ( z ) ⋅ G ( z ) ) = ∑ i ≤ 0 n ( [ z i ] F ( z ) ) ( [ z n − i ] G ( z ) ) [z^n](\mathbf{F}(z)\cdot \mathbf{G}(z))=\sum_{i\leq 0}^{n}([z^i]\mathbf{F}(z))([z^{n-i}]\mathbf{G}(z)) [ z n ] ( F ( z ) ⋅ G ( z )) = ∑ i ≤ 0 n ([ z i ] F ( z )) ([ z n − i ] G ( z )) ,据此生成函数的乘法又称卷积。
卷积可用 FFT 优化做到 O ( n log n ) O(n\log n) O ( n log n ) (在有限域 Z / p Z \mathbb{Z}/p\mathbb{Z} Z / p Z 中可用 NTT 替代),不过 FFT 不允许在 NOI 中考察,故 O ( n 2 ) O(n^2) O ( n 2 ) 暴力卷积足够。
例 1 :⟨ 1 , 1 , 1 , ⋯ ⟩ = 1 1 − z \langle 1,1,1,\cdots\rangle=\frac{1}{1-z} ⟨ 1 , 1 , 1 , ⋯ ⟩ = 1 − z 1 。
证明(R to L) :1 1 − z = ( 1 − z ) − 1 = ∑ i ≥ 0 ( − 1 i ) ( − z ) i = ∑ i ≥ 0 ( i i ) z i = ∑ i ≥ 0 z i = ⟨ 1 , 1 , 1 , ⋯ ⟩ \frac{1}{1-z}=(1-z)^{-1}=\sum_{i\geq 0}\binom{-1}{i}(-z)^i=\sum_{i\geq 0}\binom{i}{i}z^i=\sum_{i\geq 0}z^i=\langle 1,1,1,\cdots\rangle 1 − z 1 = ( 1 − z ) − 1 = ∑ i ≥ 0 ( i − 1 ) ( − z ) i = ∑ i ≥ 0 ( i i ) z i = ∑ i ≥ 0 z i = ⟨ 1 , 1 , 1 , ⋯ ⟩ 。
证明(L to R) :记 F ( z ) = ⟨ 1 , 1 , 1 , ⋯ ⟩ \mathbf{F}(z)=\langle 1,1,1,\cdots \rangle F ( z ) = ⟨ 1 , 1 , 1 , ⋯ ⟩ ,则 z F ( z ) = ⟨ 0 , 1 , 1 , 1 , ⋯ ⟩ z\mathbf{F}(z)=\langle 0,1,1,1,\cdots\rangle z F ( z ) = ⟨ 0 , 1 , 1 , 1 , ⋯ ⟩ ,故 z F ( z ) + 1 = F ( z ) z\mathbf{F}(z)+1=\mathbf{F}(z) z F ( z ) + 1 = F ( z ) ,解得 F ( z ) = 1 1 − z \mathbf{F}(z)=\frac{1}{1-z} F ( z ) = 1 − z 1 。
例 2 :⟨ 1 , c , c 2 , ⋯ ⟩ = 1 1 − c z \langle 1,c,c^2,\cdots\rangle=\frac{1}{1-cz} ⟨ 1 , c , c 2 , ⋯ ⟩ = 1 − cz 1 。
证明 :1 1 − c z = ( 1 − c z ) − 1 = ∑ i ≥ 0 ( − 1 i ) ( − c z ) i = ∑ i ≥ 0 c i z i = ⟨ 1 , c , c 2 , ⋯ ⟩ \frac{1}{1-cz}=(1-cz)^{-1}=\sum_{i\geq 0}\binom{-1}{i}(-cz)^i=\sum_{i\geq 0}c^iz^i=\langle 1,c,c^2,\cdots\rangle 1 − cz 1 = ( 1 − cz ) − 1 = ∑ i ≥ 0 ( i − 1 ) ( − cz ) i = ∑ i ≥ 0 c i z i = ⟨ 1 , c , c 2 , ⋯ ⟩ 。
例 3 :⟨ ( n 0 ) , ( n 1 ) , ( n 2 ) , ⋯ ⟩ = ( 1 + z ) n \langle \binom{n}{0},\binom{n}{1},\binom{n}{2},\cdots \rangle=(1+z)^n ⟨ ( 0 n ) , ( 1 n ) , ( 2 n ) , ⋯ ⟩ = ( 1 + z ) n 。
证明 :二项式定理。
例 4 :⟨ ( n + 0 − 1 0 ) , ( n + 1 − 1 1 ) , ( n + 2 − 1 2 ) , ⋯ ⟩ = 1 ( 1 − z ) n \langle \binom{n+0-1}{0},\binom{n+1-1}{1},\binom{n+2-1}{2},\cdots\rangle=\frac{1}{(1-z)^n} ⟨ ( 0 n + 0 − 1 ) , ( 1 n + 1 − 1 ) , ( 2 n + 2 − 1 ) , ⋯ ⟩ = ( 1 − z ) n 1 。
证明 :1 ( 1 − z ) n = ( 1 − z ) − n = ∑ i ≥ 0 ( − n i ) ( − z ) i = ∑ i ≥ 0 ( n + i − 1 i ) z i = ⟨ ( n + 0 − 1 0 ) , ( n + 1 − 1 1 ) , ( n + 2 − 1 2 ) , ⋯ ⟩ \frac{1}{(1-z)^n}=(1-z)^{-n}=\sum_{i\geq 0} \binom{-n}{i}(-z)^i=\sum_{i\geq 0}\binom{n+i-1}{i}z^i=\langle \binom{n+0-1}{0},\binom{n+1-1}{1},\binom{n+2-1}{2},\cdots\rangle ( 1 − z ) n 1 = ( 1 − z ) − n = ∑ i ≥ 0 ( i − n ) ( − z ) i = ∑ i ≥ 0 ( i n + i − 1 ) z i = ⟨ ( 0 n + 0 − 1 ) , ( 1 n + 1 − 1 ) , ( 2 n + 2 − 1 ) , ⋯ ⟩ 。
例 5 :⟨ ( 0 n ) , ( 1 n ) , ( 2 n ) , ⋯ ⟩ = x n ( 1 − x ) n + 1 \langle \binom{0}{n},\binom{1}{n},\binom{2}{n},\cdots\rangle=\frac{x^n}{(1-x)^{n+1}} ⟨ ( n 0 ) , ( n 1 ) , ( n 2 ) , ⋯ ⟩ = ( 1 − x ) n + 1 x n 。
证明 :z n ( 1 − z ) n + 1 = z n ( 1 − z ) − n − 1 = z n ∑ i ≥ 0 ( − n − 1 i ) ( − z ) i = z n ∑ i ≥ 0 ( n + i n ) z i = ∑ i ≥ 0 ( i n ) z i \frac{z^n}{(1-z)^{n+1}}=z^n(1-z)^{-n-1}=z^n\sum_{i\geq 0} \binom{-n-1}{i}(-z)^i=z^n\sum_{i\geq 0}\binom{n+i}{n}z^i=\sum_{i\geq 0}\binom{i}{n}z^i ( 1 − z ) n + 1 z n = z n ( 1 − z ) − n − 1 = z n ∑ i ≥ 0 ( i − n − 1 ) ( − z ) i = z n ∑ i ≥ 0 ( n n + i ) z i = ∑ i ≥ 0 ( n i ) z i 。
例 6 :⟨ 0 , ( − 1 ) 1 + 1 1 , ( − 1 ) 2 + 1 2 , ⋯ ⟩ = ln ( 1 + z ) \langle 0,\frac{(-1)^{1+1}}{1},\frac{(-1)^{2+1}}{2},\cdots\rangle=\ln(1+z) ⟨ 0 , 1 ( − 1 ) 1 + 1 , 2 ( − 1 ) 2 + 1 , ⋯ ⟩ = ln ( 1 + z ) 。
证明 :根据数学知识得 ( ln ( 1 + z ) ) ( n ) = ( − 1 ) n + 1 ( 1 + z ) − n ( n − 1 ) ! (\ln(1+z))^{(n)}=(-1)^{n+1}(1+z)^{-n}(n-1)! ( ln ( 1 + z ) ) ( n ) = ( − 1 ) n + 1 ( 1 + z ) − n ( n − 1 )! 。故 ( ln ( 1 + z ) ) ( n ) ( 0 ) = ( − 1 ) n + 1 ( n − 1 ! ) (\ln(1+z))^{(n)}(0)=(-1)^{n+1}(n-1!) ( ln ( 1 + z ) ) ( n ) ( 0 ) = ( − 1 ) n + 1 ( n − 1 !) ,代入 Taylor 公式即得证。
例 7 :⟨ 1 0 ! , 1 1 ! , 1 2 ! , ⋯ ⟩ = exp ( z ) \langle \frac{1}{0!},\frac{1}{1!},\frac{1}{2!},\cdots\rangle=\exp(z) ⟨ 0 ! 1 , 1 ! 1 , 2 ! 1 , ⋯ ⟩ = exp ( z ) 。
证明 :根据数学知识得 ( e z ) ( n ) = e z (e^z)^{(n)}=e^z ( e z ) ( n ) = e z 。故 ( e z ) ( n ) ( 0 ) = 1 (e^z)^{(n)}(0)=1 ( e z ) ( n ) ( 0 ) = 1 ,代入 Taylor 公式即得证。
求 Fibonacci 数列的生成函数与通项公式。
由于 f i b ( n ) = f i b ( n − 1 ) + f i b ( n − 2 ) \mathrm{fib}(n)=\mathrm{fib}(n-1)+\mathrm{fib}(n-2) fib ( n ) = fib ( n − 1 ) + fib ( n − 2 ) ,故 f i b \mathrm{fib} fib 的生成函数 A ( z ) \mathbf{A}(z) A ( z ) 满足 A ( z ) = A ( z ) ( z + z 2 ) + z \mathbf{A}(z)=\mathbf{A}(z)(z+z^2)+z A ( z ) = A ( z ) ( z + z 2 ) + z (最后的那个 z z z 是为了处理 f i b ( 0 ) = 0 , f i b ( 1 ) = 1 \mathrm{fib}(0)=0,\mathrm{fib}(1)=1 fib ( 0 ) = 0 , fib ( 1 ) = 1 )。
解得:
A ( z ) = z 1 − z − z 2 \boxed{\mathbf{A}(z)=\frac{z}{1-z-z^2}} A ( z ) = 1 − z − z 2 z
欲求通项公式,尝试对 A ( z ) \mathbf{A}(z) A ( z ) 进行变形:
A ( z ) = z 1 − z − z 2 = − z ( z − z 0 ) ( z − z 1 ) = − − z 1 z 0 ( z − z 0 ) + ( z − z 1 ) ( z − z 0 ) ( z − z 1 ) ⋅ ( − z 1 z 0 + 1 ) − 1 \mathbf{A}(z)=\frac{z}{1-z-z^2}=-\frac{z}{(z-z_0)(z-z_1)}=-\frac{-\frac{z_1}{z_0}(z-z_0)+(z-z_1)}{(z-z_0)(z-z_1)}\cdot \left(-\frac{z_1}{z_0}+1\right)^{-1} A ( z ) = 1 − z − z 2 z = − ( z − z 0 ) ( z − z 1 ) z = − ( z − z 0 ) ( z − z 1 ) − z 0 z 1 ( z − z 0 ) + ( z − z 1 ) ⋅ ( − z 0 z 1 + 1 ) − 1
其中 z 0 , z 1 z_0,z_1 z 0 , z 1 为 1 − z − z 2 = 0 1-z-z^2=0 1 − z − z 2 = 0 的两个根。
令 b = − z 1 z 0 ⋅ ( − z 1 z 0 + 1 ) − 1 , a = ( − z 1 z 0 + 1 ) − 1 b=-\frac{z_1}{z_0}\cdot \left(-\frac{z_1}{z_0}+1\right)^{-1},a=\left(-\frac{z_1}{z_0}+1\right)^{-1} b = − z 0 z 1 ⋅ ( − z 0 z 1 + 1 ) − 1 , a = ( − z 0 z 1 + 1 ) − 1 ,得到:
A ( z ) = − ( a z − z 0 + b z − z 1 ) \mathbf{A}(z)=-\left(\frac{a}{z-z_0}+\frac{b}{z-z_1}\right) A ( z ) = − ( z − z 0 a + z − z 1 b )
讨论一下 1 z − k = − ( z − k ) − 1 = − ∑ i ≥ 0 ( − 1 i ) z i k − 1 − i ( − 1 ) − 1 − i = − ∑ i ≥ 0 k − 1 − i z i \frac{1}{z-k}=-(z-k)^{-1}=-\sum_{i\geq 0}\binom{-1}{i}z^ik^{-1-i}(-1)^{-1-i}=-\sum_{i\geq 0}k^{-1-i}z^i z − k 1 = − ( z − k ) − 1 = − ∑ i ≥ 0 ( i − 1 ) z i k − 1 − i ( − 1 ) − 1 − i = − ∑ i ≥ 0 k − 1 − i z i ,对 A ( z ) \mathbf{A}(z) A ( z ) 变形:
A ( z ) = a ∑ i ≥ 0 z 0 − i − 1 z i + b ∑ i ≥ 0 z 1 − i − 1 z i = ∑ i ≥ 0 ( ( a z 0 − 1 ) ( z 0 − 1 ) i + ( b z 1 − 1 ) ( z 1 − 1 ) i ) z i \mathbf{A}(z)=a\sum_{i\geq 0}z_0^{-i-1}z^i+b\sum_{i\geq 0} z_1^{-i-1} z^i=\sum_{i\geq 0}((az_0^{-1})(z_0^{-1})^i+(bz_1^{-1})(z_1^{-1})^i)z^i A ( z ) = a i ≥ 0 ∑ z 0 − i − 1 z i + b i ≥ 0 ∑ z 1 − i − 1 z i = i ≥ 0 ∑ (( a z 0 − 1 ) ( z 0 − 1 ) i + ( b z 1 − 1 ) ( z 1 − 1 ) i ) z i
故通项公式为 f i b ( n ) = ( a z 0 − 1 ) ( z 0 − 1 ) n + ( b z 1 − 1 ) ( z 1 − 1 ) n \mathrm{fib}(n)=(az_0^{-1})(z_0^{-1})^n+(bz_1^{-1})(z_1^{-1})^n fib ( n ) = ( a z 0 − 1 ) ( z 0 − 1 ) n + ( b z 1 − 1 ) ( z 1 − 1 ) n ,经计算得:
z 0 = − 1 − 5 2 , z 1 = − 1 + 5 2 , a = 5 + 5 10 , b = 5 − 5 10 z_0=\frac{-1-\sqrt{5}}{2},z_1=\frac{-1+\sqrt{5}}{2},a=\frac{5+\sqrt{5}}{10},b=\frac{5-\sqrt{5}}{10} z 0 = 2 − 1 − 5 , z 1 = 2 − 1 + 5 , a = 10 5 + 5 , b = 10 5 − 5
代入得到:
f i b ( n ) = 5 5 ( − ( 1 − 5 2 ) n + ( 1 + 5 2 ) n ) \boxed{\mathrm{fib}(n)=\frac{\sqrt{5}}{5}\left(-\left(\frac{1-\sqrt{5}}{2}\right)^n+\left(\frac{1+\sqrt{5}}{2}\right)^n\right)} fib ( n ) = 5 5 ( − ( 2 1 − 5 ) n + ( 2 1 + 5 ) n )
PS:写完后发现好像有更好的方法,比如直接用方程解出 a , b a,b a , b 之类,不过直接代数变形感觉自然一些,虽然这样计算麻烦。 PPS:好像网上的公式最前面的系数都是 1 5 \frac{1}{\sqrt{5}} 5 1 ,原因不明,反正都是等价的。 生成函数方法解递推式是中学阶段所谓“特征根法”的一种理论依据。
事实上一般的常系数齐次线性递推(以下简称线性递推)也可以用此方法求出生成函数与通项公式,由于通项公式极其复杂且不实用,我们仅讨论生成函数。
定理:对于任意线性递推,其生成函数均为有理函数。我们将会构造这样的有理函数来证明它。
现在我们需要根据线性递推关系 a n = ∑ i = 1 k f i a n − i a_n=\sum_{i=1}^{k} f_i a_{n-i} a n = ∑ i = 1 k f i a n − i 求出 P , Q P,Q P , Q ,使得 [ z n ] ( P ( z ) Q ( z ) ) = a n [z^n]\left(\frac{P(z)}{Q(z)}\right)=a_n [ z n ] ( Q ( z ) P ( z ) ) = a n 。
考虑如果我们已经求出了这样的 R ( z ) = P ( z ) Q ( z ) R(z)=\frac{P(z)}{Q(z)} R ( z ) = Q ( z ) P ( z ) ,那么它应该具有怎样的性质。简便起见,令 C ( z ) = ∑ i = 1 k f i z i , A ( z ) = ∑ n ≥ 0 ∑ n = 0 k − 1 a n z n C(z)=\sum_{i=1}^{k} f_iz^i,A(z)=\sum_{n\geq 0} \sum_{n=0}^{k-1} a_nz^n C ( z ) = ∑ i = 1 k f i z i , A ( z ) = ∑ n ≥ 0 ∑ n = 0 k − 1 a n z n 。
然后稍作推导:
R ( z ) = ∑ n ≥ 0 a n z n = ∑ n ≥ k a n z n + ∑ n = 0 k − 1 a n z n = ∑ n ≥ k z n ∑ i = 1 k f i a n − i + ∑ n = 0 k − 1 a n z n = ∑ n ≥ 0 z n ∑ i = 1 k f i a n − i + ∑ n = 0 k − 1 a n z n − ∑ n = 0 k − 1 z n ∑ i = 1 n f i a n − i = C ( z ) R ( z ) + A ( z ) − ( A ( z ) C ( z ) m o d z k ) \begin{aligned} R(z)&=\sum_{n\geq 0} a_nz^n=\sum_{n\geq k}a_nz^n+\sum_{n=0}^{k-1} a_nz^n\\ &=\sum_{n\geq k} z^n\sum_{i=1}^{k} f_ia_{n-i}+\sum_{n=0}^{k-1} a_nz^n\\ &=\sum_{n\geq 0}z^n\sum_{i=1}^{k} f_ia_{n-i}+\sum_{n=0}^{k-1} a_nz^n-\sum_{n=0}^{k-1} z^n\sum_{i=1}^{n} f_ia_{n-i}\\ &=C(z)R(z)+A(z)-(A(z)C(z) \bmod z^k) \end{aligned} R ( z ) = n ≥ 0 ∑ a n z n = n ≥ k ∑ a n z n + n = 0 ∑ k − 1 a n z n = n ≥ k ∑ z n i = 1 ∑ k f i a n − i + n = 0 ∑ k − 1 a n z n = n ≥ 0 ∑ z n i = 1 ∑ k f i a n − i + n = 0 ∑ k − 1 a n z n − n = 0 ∑ k − 1 z n i = 1 ∑ n f i a n − i = C ( z ) R ( z ) + A ( z ) − ( A ( z ) C ( z ) mod z k )
因此:
R ( z ) = C ( z ) R ( z ) + A ( z ) − ( A ( z ) C ( z ) m o d z k ) ⟹ ( 1 − C ( z ) ) R ( z ) = A ( z ) − ( A ( z ) C ( z ) m o d z k ) ⟹ R ( z ) = A ( z ) − ( A ( z ) C ( z ) m o d z k ) 1 − C ( z ) \begin{aligned} &R(z)=C(z)R(z)+A(z)-(A(z)C(z) \bmod z^k)\\ &\implies (1-C(z))R(z)=A(z)-(A(z)C(z) \bmod z^k)\\ &\implies R(z)=\frac{A(z)-(A(z)C(z) \bmod z^k)}{1-C(z)} \end{aligned} R ( z ) = C ( z ) R ( z ) + A ( z ) − ( A ( z ) C ( z ) mod z k ) ⟹ ( 1 − C ( z )) R ( z ) = A ( z ) − ( A ( z ) C ( z ) mod z k ) ⟹ R ( z ) = 1 − C ( z ) A ( z ) − ( A ( z ) C ( z ) mod z k )
令 P ( z ) = A ( z ) − ( A ( z ) C ( z ) m o d z k ) , Q ( z ) = 1 − C ( z ) P(z)=A(z)-(A(z)C(z) \bmod z^k),Q(z)=1-C(z) P ( z ) = A ( z ) − ( A ( z ) C ( z ) mod z k ) , Q ( z ) = 1 − C ( z ) 即得到合法的 P , Q P,Q P , Q 。
这个生成函数有什么用呢?我们可以结合 Bostan-Mori 求分式远处系数算法 O ( k log k log n ) O(k\log k\log n) O ( k log k log n ) 求出线性递推的某一项,这远远快于常规的矩阵快速幂算法(O ( k 3 log n ) O(k^3\log n) O ( k 3 log n ) )。
让我们着手解决一道非线性递推。
求递推式 a n = a n − 1 + a n − 2 + 1 a_n=a_{n-1}+a_{n-2}+1 a n = a n − 1 + a n − 2 + 1 ,a 0 = a 1 = 1 a_0=a_1=1 a 0 = a 1 = 1 的生成函数 A ( z ) \mathbf{A}(z) A ( z ) 。
根据递推公式,很容易写出新的方程:
A ( z ) = ( z + z 2 ) A ( z ) + 1 1 − z \mathbf{A}(z)=(z+z^2)\mathbf{A}(z)+\frac{1}{1-z} A ( z ) = ( z + z 2 ) A ( z ) + 1 − z 1
故可以解得:
A ( z ) = 1 ( 1 − z ) ( 1 − z − z 2 ) \mathbf{A}(z)=\frac{1}{(1-z)(1-z-z^2)} A ( z ) = ( 1 − z ) ( 1 − z − z 2 ) 1
由此例我们可以看到,许多对线性递推进行微小变形的非线性递推,仍然可以用生成函数轻易解决。
求:
∑ i = 0 n ( i n − i ) \sum_{i=0}^{n}\binom{i}{n-i} i = 0 ∑ n ( n − i i )
不妨构造生成函数,然后进行代数变换:
A ( z ) = ∑ i ≥ 0 ( ∑ j = 0 i ( j i − j ) ) z i = ∑ j ≥ 0 ∑ i ≥ j ( j i − j ) z i = ∑ j ≥ 0 ∑ i ≥ 0 ( j i ) z i + j = ∑ i ≥ 0 z i ∑ j ≥ 0 ( j i ) z j = ∑ i ≥ 0 z i ⋅ z i ( 1 − z ) i + 1 = 1 1 − z ∑ i ≥ 0 ( z 2 1 − z ) i = 1 1 − z ⋅ 1 1 − z 2 1 − z = 1 1 − z ⋅ 1 − z 1 − z − z 2 = 1 1 − z − z 2 \begin{aligned} \mathbf{A}(z)&=\sum_{i\geq 0}\left(\sum_{j=0}^{i}\binom{j}{i-j}\right)z^i=\sum_{j\geq 0}\sum_{i\geq j}\binom{j}{i-j}z^i=\sum_{j\geq 0}\sum_{i\geq 0}\binom{j}{i}z^{i+j}=\sum_{i\geq 0}z^i\sum_{j\geq 0}\binom{j}{i}z^j=\sum_{i\geq 0} z^i\cdot \frac{z^i}{(1-z)^{i+1}}\\ &=\frac{1}{1-z}\sum_{i\geq 0}\left(\frac{z^2}{1-z}\right)^i=\frac{1}{1-z}\cdot \frac{1}{1-\frac{z^2}{1-z}}=\frac{1}{1-z}\cdot \frac{1-z}{1-z-z^2}=\frac{1}{1-z-z^2} \end{aligned} A ( z ) = i ≥ 0 ∑ ( j = 0 ∑ i ( i − j j ) ) z i = j ≥ 0 ∑ i ≥ j ∑ ( i − j j ) z i = j ≥ 0 ∑ i ≥ 0 ∑ ( i j ) z i + j = i ≥ 0 ∑ z i j ≥ 0 ∑ ( i j ) z j = i ≥ 0 ∑ z i ⋅ ( 1 − z ) i + 1 z i = 1 − z 1 i ≥ 0 ∑ ( 1 − z z 2 ) i = 1 − z 1 ⋅ 1 − 1 − z z 2 1 = 1 − z 1 ⋅ 1 − z − z 2 1 − z = 1 − z − z 2 1
根据经典的结果,Fibonacci 数列的生成函数是 z 1 − z − z 2 \frac{z}{1-z-z^2} 1 − z − z 2 z ,故我们立即得到原式即为 f i b ( n + 1 ) \mathrm{fib}(n+1) fib ( n + 1 ) 。
证明范德蒙德卷积公式:
∑ i ≥ 0 ( n i ) ( m k − i ) = ( n + m k ) \sum_{i\geq 0}\binom{n}{i}\binom{m}{k-i}=\binom{n+m}{k} i ≥ 0 ∑ ( i n ) ( k − i m ) = ( k n + m )
不妨构造生成函数,然后进行代数变换:
A ( z ) = ∑ k ≥ 0 ( ∑ i ≥ 0 ( n i ) ( m k − i ) ) z k = ∑ k ≥ 0 ∑ i ≥ 0 ( n i ) z i ⋅ ( m k − i ) z k − i = ( ∑ i ≥ 0 ( n i ) z i ) ( ∑ i ≥ 0 ( m i ) z i ) = ( 1 + z ) n ( 1 + z ) m = ( 1 + z ) n + m = ∑ k ≥ 0 ( n + m k ) z k \begin{aligned} \mathbf{A}(z)&=\sum_{k\geq 0}\left(\sum_{i\geq 0}\binom{n}{i}\binom{m}{k-i}\right) z^k=\sum_{k\geq 0}\sum_{i\geq 0}\binom{n}{i}z^i\cdot \binom{m}{k-i}z^{k-i}=\left(\sum_{i\geq 0} \binom{n}{i}z^i\right)\left(\sum_{i\geq 0}\binom{m}{i}z^i\right)\\ &=(1+z)^n(1+z)^m=(1+z)^{n+m}=\sum_{k\geq 0}\binom{n+m}{k}z^k \end{aligned} A ( z ) = k ≥ 0 ∑ ( i ≥ 0 ∑ ( i n ) ( k − i m ) ) z k = k ≥ 0 ∑ i ≥ 0 ∑ ( i n ) z i ⋅ ( k − i m ) z k − i = ( i ≥ 0 ∑ ( i n ) z i ) ( i ≥ 0 ∑ ( i m ) z i ) = ( 1 + z ) n ( 1 + z ) m = ( 1 + z ) n + m = k ≥ 0 ∑ ( k n + m ) z k
故原命题得证。
定义卡特兰数 C n C_n C n 表示 n n n 个点的无标号有根二叉树数量(区分左右子树)。
求卡特兰数的卷积递推公式、生成函数、通项公式、递推公式。
根据卡特兰数的定义,我们有:
C n = ∑ i = 0 n − 1 C i C n − i − 1 C_n=\sum_{i=0}^{n-1}C_iC_{n-i-1} C n = i = 0 ∑ n − 1 C i C n − i − 1
大意就是枚举左子树有 i i i 个点,那么右子树就有 n − i − 1 n-i-1 n − i − 1 个点(还有一个点是根本身),根据乘法原理乘起来即可。
边界条件 C 0 = 1 C_0=1 C 0 = 1 ,我们得到了卡特兰数的卷积递推公式,现在尝试求出它的生成函数 C ( z ) \mathbf{C}(z) C ( z ) 。
根据卷积递推公式,我们有 C ( z ) = z C ( z ) 2 + 1 \mathbf{C}(z)=z\mathbf{C}(z)^2+1 C ( z ) = z C ( z ) 2 + 1 ,解方程 z C ( z ) 2 − C ( z ) + 1 = 0 z\mathbf{C}(z)^2-\mathbf{C}(z)+1=0 z C ( z ) 2 − C ( z ) + 1 = 0 得到两个根:
C 0 ( z ) = 1 − 1 − 4 z 2 z , C 1 ( z ) = 1 + 1 − 4 z 2 z \mathbf{C}_0(z)=\frac{1-\sqrt{1-4z}}{2z},\mathbf{C}_1(z)=\frac{1+\sqrt{1-4z}}{2z} C 0 ( z ) = 2 z 1 − 1 − 4 z , C 1 ( z ) = 2 z 1 + 1 − 4 z
取 z = 0 z=0 z = 0 ,C 0 ( z ) \mathbf{C}_0(z) C 0 ( z ) 会得到未定式,C 1 ( z ) \mathbf{C}_1(z) C 1 ( z ) 则无定义。由于 z = 0 z=0 z = 0 处生成函数的极限必须有定义,所以舍去 C 1 ( z ) \mathbf{C}_1(z) C 1 ( z ) 并对 C 0 ( z ) \mathbf{C}_0(z) C 0 ( z ) 进行分子有理化:
C 0 ( z ) = 2 1 + 1 − 4 z \mathbf{C}_0(z)=\frac{2}{1+\sqrt{1-4z}} C 0 ( z ) = 1 + 1 − 4 z 2
满足 C 0 ( 0 ) = 1 \mathbf{C}_0(0)=1 C 0 ( 0 ) = 1 符合条件,故令 C ( z ) = C 0 ( z ) \mathbf{C}(z)=\mathbf{C}_0(z) C ( z ) = C 0 ( z ) 得到:
C ( z ) = 2 1 + 1 − 4 z = 1 − 1 − 4 z 2 z \boxed{\mathbf{C}(z)=\frac{2}{1+\sqrt{1-4z}}=\frac{1-\sqrt{1-4z}}{2z}} C ( z ) = 1 + 1 − 4 z 2 = 2 z 1 − 1 − 4 z
现在我们推导通项公式,对 C ( z ) \mathbf{C}(z) C ( z ) 进行代数变形:
C ( z ) = ( 1 − ( 1 − 4 z ) 1 / 2 ) ( 2 z ) − 1 = ( 2 z ) − 1 ( 1 − ∑ i ≥ 0 ( 1 / 2 i ) ( − 4 z ) i ) \mathbf{C}(z)=(1-(1-4z)^{1/2})(2z)^{-1}=(2z)^{-1}\left(1-\sum_{i\geq 0} \binom{1/2}{i}(-4z)^{i}\right) C ( z ) = ( 1 − ( 1 − 4 z ) 1/2 ) ( 2 z ) − 1 = ( 2 z ) − 1 ( 1 − i ≥ 0 ∑ ( i 1/2 ) ( − 4 z ) i )
考察广义二项式系数 ( 1 / 2 i ) \binom{1/2}{i} ( i 1/2 ) :
( 1 / 2 i ) = 1 i ! ( 1 2 ) i ‾ = 1 i ! ∏ k = 0 i − 1 ( 1 2 − k ) = 1 i ! ∏ k = 0 i − 1 1 − 2 k 2 = 1 i ! ⋅ 2 i ∏ k = 0 i − 1 1 − 2 k = ( − 1 ) i + 1 i ! ⋅ 2 i ∏ k = 1 i − 1 2 k − 1 = ( − 1 ) i + 1 i ! ⋅ 2 i ⋅ ( 2 i − 2 ) ! 2 i − 1 ( i − 1 ) ! = ( − 1 ) i + 1 ( 2 i − 2 ) ! i ! ( i − 1 ) ! 2 2 i − 1 = ( 2 i − 1 i ) ⋅ ( − 1 ) i + 1 ( 2 i − 1 ) 2 2 i − 1 \begin{aligned} \binom{1/2}{i}&=\frac{1}{i!}\left(\frac{1}{2}\right)^{\underline{i}}=\frac{1}{i!}\prod_{k=0}^{i-1} \left(\frac{1}{2}-k\right)=\frac{1}{i!}\prod_{k=0}^{i-1}\frac{1-2k}{2}=\frac{1}{i!\cdot 2^i}\prod_{k=0}^{i-1}1-2k=\frac{(-1)^{i+1}}{i!\cdot 2^i}\prod_{k=1}^{i-1}2k-1\\ &=\frac{(-1)^{i+1}}{i!\cdot 2^i}\cdot \frac{(2i-2)!}{2^{i-1}(i-1)!}=\frac{(-1)^{i+1}(2i-2)!}{i!(i-1)!2^{2i-1}}=\binom{2i-1}{i}\cdot \frac{(-1)^{i+1}}{(2i-1)2^{2i-1}} \end{aligned} ( i 1/2 ) = i ! 1 ( 2 1 ) i = i ! 1 k = 0 ∏ i − 1 ( 2 1 − k ) = i ! 1 k = 0 ∏ i − 1 2 1 − 2 k = i ! ⋅ 2 i 1 k = 0 ∏ i − 1 1 − 2 k = i ! ⋅ 2 i ( − 1 ) i + 1 k = 1 ∏ i − 1 2 k − 1 = i ! ⋅ 2 i ( − 1 ) i + 1 ⋅ 2 i − 1 ( i − 1 )! ( 2 i − 2 )! = i ! ( i − 1 )! 2 2 i − 1 ( − 1 ) i + 1 ( 2 i − 2 )! = ( i 2 i − 1 ) ⋅ ( 2 i − 1 ) 2 2 i − 1 ( − 1 ) i + 1
将结果代入和式:
∑ i ≥ 0 ( 1 / 2 i ) ( − 4 z ) i = ∑ i ≥ 0 ( 2 i − 1 i ) ⋅ ( − 1 ) i + 1 ( 2 i − 1 ) 2 2 i − 1 ⋅ ( − 1 ) i ⋅ 2 2 i ⋅ z i = − 2 ∑ i ≥ 0 1 2 i − 1 ( 2 i − 1 i ) z i \begin{aligned} \sum_{i\geq 0}\binom{1/2}{i}(-4z)^i&=\sum_{i\geq 0}\binom{2i-1}{i}\cdot \frac{(-1)^{i+1}}{(2i-1)2^{2i-1}}\cdot (-1)^i\cdot 2^{2i}\cdot z^i\\&=-2\sum_{i\geq 0}\frac{1}{2i-1}\binom{2i-1}{i}z^i \end{aligned} i ≥ 0 ∑ ( i 1/2 ) ( − 4 z ) i = i ≥ 0 ∑ ( i 2 i − 1 ) ⋅ ( 2 i − 1 ) 2 2 i − 1 ( − 1 ) i + 1 ⋅ ( − 1 ) i ⋅ 2 2 i ⋅ z i = − 2 i ≥ 0 ∑ 2 i − 1 1 ( i 2 i − 1 ) z i
将结果代入原式:
( 2 z ) − 1 ( 1 − ∑ i ≥ 0 ( 1 / 2 i ) ( − 4 z ) i ) = 1 2 z ( 1 + 2 ∑ i ≥ 0 1 2 i − 1 ( 2 i − 1 i ) z i ) = 1 z ∑ i ≥ 1 1 2 i − 1 ( 2 i − 1 i ) z i = ∑ i ≥ 1 1 2 i − 1 ( 2 i − 1 i ) z i − 1 = ∑ i ≥ 0 1 2 i + 1 ( 2 i + 1 i + 1 ) z i = ∑ i ≥ 0 1 2 i + 1 ⋅ 2 i + 1 i + 1 ( 2 i i ) z i = ∑ i ≥ 0 1 i + 1 ( 2 i i ) z i \begin{aligned} (2z)^{-1}\left(1-\sum_{i\geq 0} \binom{1/2}{i}(-4z)^{i}\right)&=\frac{1}{2z}\left(1+2\sum_{i\geq 0}\frac{1}{2i-1}\binom{2i-1}{i}z^i\right)\\ &=\frac{1}{z}\sum_{i\geq 1}\frac{1}{2i-1}\binom{2i-1}{i}z^i=\sum_{i\geq 1}\frac{1}{2i-1}\binom{2i-1}{i}z^{i-1}\\ &=\sum_{i\geq 0}\frac{1}{2i+1}\binom{2i+1}{i+1}z^i=\sum_{i\geq 0}\frac{1}{2i+1}\cdot \frac{2i+1}{i+1}\binom{2i}{i}z^i\\ &=\sum_{i\geq 0}\frac{1}{i+1}\binom{2i}{i}z^i \end{aligned} ( 2 z ) − 1 ( 1 − i ≥ 0 ∑ ( i 1/2 ) ( − 4 z ) i ) = 2 z 1 ( 1 + 2 i ≥ 0 ∑ 2 i − 1 1 ( i 2 i − 1 ) z i ) = z 1 i ≥ 1 ∑ 2 i − 1 1 ( i 2 i − 1 ) z i = i ≥ 1 ∑ 2 i − 1 1 ( i 2 i − 1 ) z i − 1 = i ≥ 0 ∑ 2 i + 1 1 ( i + 1 2 i + 1 ) z i = i ≥ 0 ∑ 2 i + 1 1 ⋅ i + 1 2 i + 1 ( i 2 i ) z i = i ≥ 0 ∑ i + 1 1 ( i 2 i ) z i
故我们得到了卡特兰数的一个通项公式:
C n = 1 n + 1 ( 2 n n ) \boxed{C_n=\frac{1}{n+1}\binom{2n}{n}} C n = n + 1 1 ( n 2 n )
又因为:
1 n + 1 ( 2 n n ) = ( 2 n n ) − n n + 1 ( 2 n n ) = ( 2 n n ) − n n + 1 ⋅ ( 2 n ) ! ( n ! ) 2 = ( 2 n n ) − ( 2 n ) ! ( n − 1 ) ! ( n + 1 ) ! = ( 2 n n ) − ( 2 n n − 1 ) \frac{1}{n+1}\binom{2n}{n}=\binom{2n}{n}-\frac{n}{n+1}\binom{2n}{n}=\binom{2n}{n}-\frac{n}{n+1}\cdot \frac{(2n)!}{(n!)^2}=\binom{2n}{n}-\frac{(2n)!}{(n-1)!(n+1)!}=\binom{2n}{n}-\binom{2n}{n-1} n + 1 1 ( n 2 n ) = ( n 2 n ) − n + 1 n ( n 2 n ) = ( n 2 n ) − n + 1 n ⋅ ( n ! ) 2 ( 2 n )! = ( n 2 n ) − ( n − 1 )! ( n + 1 )! ( 2 n )! = ( n 2 n ) − ( n − 1 2 n )
故我们得到了卡特兰数的另一个通项公式:
C n = ( 2 n n ) − ( 2 n n − 1 ) \boxed{C_n=\binom{2n}{n}-\binom{2n}{n-1}} C n = ( n 2 n ) − ( n − 1 2 n )
不妨将卡特兰数邻项作比:
C n C n − 1 = 1 n + 1 ( 2 n n ) 1 n ( 2 n − 2 n − 1 ) = ( 2 n ) ! ( n ! ) 2 ( n + 1 ) ( 2 n − 2 ) ! ( ( n − 1 ) ! ) 2 n = 2 n ( 2 n − 1 ) n ( n + 1 ) = 4 n − 2 n + 1 \frac{C_n}{C_{n-1}}=\frac{\frac{1}{n+1}\binom{2n}{n}}{\frac{1}{n}\binom{2n-2}{n-1}}=\frac{\frac{(2n)!}{(n!)^2(n+1)}}{\frac{(2n-2)!}{((n-1)!)^2n}}=\frac{2n(2n-1)}{n(n+1)}=\frac{4n-2}{n+1} C n − 1 C n = n 1 ( n − 1 2 n − 2 ) n + 1 1 ( n 2 n ) = (( n − 1 )! ) 2 n ( 2 n − 2 )! ( n ! ) 2 ( n + 1 ) ( 2 n )! = n ( n + 1 ) 2 n ( 2 n − 1 ) = n + 1 4 n − 2
故我们得到了卡特兰数的递推公式:
C n = 4 n − 2 n + 1 ⋅ C n − 1 , C 0 = 1 \boxed{C_n=\frac{4n-2}{n+1}\cdot C_{n-1},C_0=1} C n = n + 1 4 n − 2 ⋅ C n − 1 , C 0 = 1
定义伯努利数 B n B_n B n 满足隐式递推公式 ∑ k = 0 n ( n + 1 k ) B k = [ n = 0 ] \sum_{k=0}^{n}\binom{n+1}{k}B_k=[n=0] ∑ k = 0 n ( k n + 1 ) B k = [ n = 0 ] ,证明:
[ z n ] z e z − 1 = B n n ! [z^n]\frac{z}{e^z-1}=\frac{B_n}{n!} [ z n ] e z − 1 z = n ! B n ,换句话说 B n B_n B n 的指数生成函数 B ^ ( z ) = z e z − 1 \hat{\mathbf{B}}(z)=\frac{z}{e^z-1} B ^ ( z ) = e z − 1 z 。定义 S k ( n ) = ∑ i = 0 n − 1 i k S_k(n)=\sum_{i=0}^{n-1}i^k S k ( n ) = ∑ i = 0 n − 1 i k ,则 S k ( n ) = 1 k + 1 ∑ i = 0 k B i ( k + 1 i ) n k − i + 1 S_k(n)=\frac{1}{k+1}\sum_{i=0}^{k}B_i\binom{k+1}{i}n^{k-i+1} S k ( n ) = k + 1 1 ∑ i = 0 k B i ( i k + 1 ) n k − i + 1 。 先来求 B n B_n B n 的 EGF,我们可以适当对隐式递推公式变形:
∑ k = 0 n ( n + 1 k ) B k = [ n = 0 ] ∑ k ≥ 0 ( n + 1 k ) B k = [ n = 0 ] + B n + 1 ∑ k ≥ 0 1 k ! ( n + 1 − k ) ! B k = [ n = 0 ] + 1 ( n + 1 ) ! B n + 1 ∑ k ≥ 0 B k k ! ⋅ 1 ( n − k ) ! = [ n = 1 ] + 1 n ! B n \begin{aligned} \sum_{k=0}^{n}\binom{n+1}{k}B_k&=[n=0]\\ \sum_{k\geq 0}\binom{n+1}{k}B_k&=[n=0]+B_{n+1}\\ \sum_{k\geq 0} \frac{1}{k!(n+1-k)!}B_k&=[n=0]+\frac{1}{(n+1)!}B_{n+1}\\ \sum_{k\geq 0}\frac{B_k}{k!}\cdot \frac{1}{(n-k)!}&=[n=1]+\frac{1}{n!}B_n \end{aligned} k = 0 ∑ n ( k n + 1 ) B k k ≥ 0 ∑ ( k n + 1 ) B k k ≥ 0 ∑ k ! ( n + 1 − k )! 1 B k k ≥ 0 ∑ k ! B k ⋅ ( n − k )! 1 = [ n = 0 ] = [ n = 0 ] + B n + 1 = [ n = 0 ] + ( n + 1 )! 1 B n + 1 = [ n = 1 ] + n ! 1 B n
将和式改写为生成函数:
B ^ ( z ) ⋅ e z = z + B ^ ( z ) ⟹ B ^ ( z ) = z e z − 1 \hat{\mathbf{B}}(z)\cdot e^z=z+\hat{\mathbf{B}}(z)\implies \hat{\mathbf{B}}(z)=\frac{z}{e^z-1} B ^ ( z ) ⋅ e z = z + B ^ ( z ) ⟹ B ^ ( z ) = e z − 1 z
故我们得到了伯努利数的指数生成函数。现在来证明它与等幂求和 S k ( n ) S_k(n) S k ( n ) 的关系。
考虑求 S k ( n ) S_k(n) S k ( n ) 的指数生成函数 S ^ n ( z ) \hat{\mathbf{S}}_n(z) S ^ n ( z ) :
S ^ n ( z ) = ∑ k ≥ 0 S k ( n ) k ! z k = ∑ k ≥ 0 ∑ i = 0 n − 1 z k i k k ! = ∑ i = 0 n − 1 ∑ k ≥ 0 ( i z ) k k ! = ∑ i = 0 n − 1 e i z = e n z − 1 e z − 1 \begin{aligned} \hat{\mathbf{S}}_n(z)=\sum_{k\geq 0}\frac{S_k(n)}{k!}z^k=\sum_{k\geq 0}\sum_{i=0}^{n-1}\frac{z^ki^k}{k!}=\sum_{i=0}^{n-1}\sum_{k\geq 0}\frac{(iz)^k}{k!}=\sum_{i=0}^{n-1}e^{iz}=\frac{e^{nz}-1}{e^z-1} \end{aligned} S ^ n ( z ) = k ≥ 0 ∑ k ! S k ( n ) z k = k ≥ 0 ∑ i = 0 ∑ n − 1 k ! z k i k = i = 0 ∑ n − 1 k ≥ 0 ∑ k ! ( i z ) k = i = 0 ∑ n − 1 e i z = e z − 1 e n z − 1
由于 e n z − 1 e z − 1 = z e z − 1 ⋅ e n z − 1 z \frac{e^{nz}-1}{e^z-1}=\frac{z}{e^z-1}\cdot \frac{e^{nz}-1}{z} e z − 1 e n z − 1 = e z − 1 z ⋅ z e n z − 1 ,又因为:
e n z − 1 z = ∑ i ≥ 1 n i i ! z i − 1 = ∑ i ≥ 0 n i + 1 z i ( i + 1 ) ! \frac{e^{nz}-1}{z}=\sum_{i\geq 1}\frac{n^i}{i!}z^{i-1}=\sum_{i\geq 0}\frac{n^{i+1}z^i}{(i+1)!} z e n z − 1 = i ≥ 1 ∑ i ! n i z i − 1 = i ≥ 0 ∑ ( i + 1 )! n i + 1 z i
所以得到:
S k ( n ) = k ! [ z k ] S ^ n ( z ) = k ! ∑ i = 0 k B i i ! ⋅ n k − i + 1 ( k − i + 1 ) ! = 1 k + 1 ∑ i = 0 k B i n k − i + 1 ( k + 1 ) ! i ! ( k − i + 1 ) ! = 1 k + 1 ∑ i = 0 k B i ( k + 1 i ) n k − i + 1 S_k(n)=k![z^k]\hat{\mathbf{S}}_n(z)=k!\sum_{i=0}^{k}\frac{B_i}{i!}\cdot \frac{n^{k-i+1}}{(k-i+1)!}=\frac{1}{k+1}\sum_{i=0}^{k}B_in^{k-i+1}\frac{(k+1)!}{i!(k-i+1)!}=\frac{1}{k+1}\sum_{i=0}^{k}B_i\binom{k+1}{i}n^{k-i+1} S k ( n ) = k ! [ z k ] S ^ n ( z ) = k ! i = 0 ∑ k i ! B i ⋅ ( k − i + 1 )! n k − i + 1 = k + 1 1 i = 0 ∑ k B i n k − i + 1 i ! ( k − i + 1 )! ( k + 1 )! = k + 1 1 i = 0 ∑ k B i ( i k + 1 ) n k − i + 1
这个公式启示我们 S k ( n ) S_k(n) S k ( n ) 是一个关于 n n n 的最高 k + 1 k+1 k + 1 次多项式。因此我们可以 O ( k 2 ) O(k^2) O ( k 2 ) 递推求出 B n B_n B n 然后 O ( k ) O(k) O ( k ) 解决等幂求和问题。
不过更加务实的方法是直接求出 S k ( 0 ) , ⋯ , S k ( k + 1 ) S_k(0),\cdots,S_k(k+1) S k ( 0 ) , ⋯ , S k ( k + 1 ) 这 k + 2 k+2 k + 2 个点值,然后拉格朗日插值求出系数。
由于点值在 N \mathbb{N} N 上连续,所以我们可以优化拉格朗日插值到 O ( k ) O(k) O ( k ) 。 这一方法将在下一节介绍。
上一节我们讨论了伯努利数,并给出了一个预处理 O ( k 2 ) O(k^2) O ( k 2 ) 查询 O ( k ) O(k) O ( k ) 的算法。不过正如前文提到的,我们有更好的算法。
观察拉格朗日插值法的公式(假设 k + 2 k+2 k + 2 个点分别为 ( x 0 , y 0 ) , ( x 1 , y 1 ) , ⋯ , ( x k + 1 , y k + 1 ) (x_0,y_0),(x_1,y_1),\cdots,(x_{k+1},y_{k+1}) ( x 0 , y 0 ) , ( x 1 , y 1 ) , ⋯ , ( x k + 1 , y k + 1 ) ):
f ( x ) = ∑ i = 0 k + 1 y i ∏ 0 ≤ j ≤ k + 1 , j ≠ i x − x j x i − x j f(x)=\sum_{i=0}^{k+1}y_i\prod_{0\leq j\leq k+1,j\neq i} \frac{x-x_j}{x_i-x_j} f ( x ) = i = 0 ∑ k + 1 y i 0 ≤ j ≤ k + 1 , j = i ∏ x i − x j x − x j
由于我们假定 x i = i x_i=i x i = i ,所以有(钦定 x > k x>k x > k ):
f ( x ) = ∑ i = 0 k + 1 y i ∏ 0 ≤ j ≤ k + 1 , j ≠ i x − j i − j = ∑ i = 0 k + 1 y i ⋅ 1 x − i ( ∏ j = 0 k + 1 x − j ) ⋅ ∏ j = 0 i − 1 1 i − j ⋅ ∏ j = i + 1 k + 1 1 i − j = ∑ i = 0 k + 1 y i ⋅ x k + 2 ‾ x − i ⋅ 1 i ! ⋅ ( − 1 ) k − i + 1 ( k − i + 1 ) ! \begin{aligned} f(x)&=\sum_{i=0}^{k+1}y_i\prod_{0\leq j\leq k+1,j\neq i}\frac{x-j}{i-j}=\sum_{i=0}^{k+1}y_i\cdot \frac{1}{x-i}\left(\prod_{j=0}^{k+1}x-j\right)\cdot \prod_{j=0}^{i-1}\frac{1}{i-j}\cdot \prod_{j=i+1}^{k+1}\frac{1}{i-j}\\ &=\sum_{i=0}^{k+1}y_i\cdot \frac{x^{\underline{k+2}}}{x-i}\cdot \frac{1}{i!}\cdot \frac{(-1)^{k-i+1}}{(k-i+1)!} \end{aligned} f ( x ) = i = 0 ∑ k + 1 y i 0 ≤ j ≤ k + 1 , j = i ∏ i − j x − j = i = 0 ∑ k + 1 y i ⋅ x − i 1 ( j = 0 ∏ k + 1 x − j ) ⋅ j = 0 ∏ i − 1 i − j 1 ⋅ j = i + 1 ∏ k + 1 i − j 1 = i = 0 ∑ k + 1 y i ⋅ x − i x k + 2 ⋅ i ! 1 ⋅ ( k − i + 1 )! ( − 1 ) k − i + 1
这样拉格朗日插值法就被优化到了 O ( k log p ) O(k\log p) O ( k log p ) (其中 p p p 是模数),可以通过模板题 CF622F The Sum of the k-th Powers 。
第二类斯特林数定义:{ n m } n \brace m { m n } 表示将 n n n 个有标号的小球放入 m m m 个无标号的盒子中,使得盒子均非空的方案数。
求第二类斯特林数的递推公式、通项公式、列指数生成函数(固定下指标)、二元生成函数(关于行为 OGF,关于列为 EGF)。
根据第二类斯特林数的定义,我们很容易写出它的递推公式:
{ n m } = { n − 1 m − 1 } + m { n − 1 m } , { n 0 } = [ n = 0 ] \boxed{{n\brace m}={n-1\brace m-1}+m{n-1\brace m},{n\brace 0}=[n=0]} { m n } = { m − 1 n − 1 } + m { m n − 1 } , { 0 n } = [ n = 0 ]
证明是平凡的,考虑第 n n n 个球的方法,要么在 n − 1 n-1 n − 1 个球的基础上新增一个盒子放入({ n − 1 m − 1 } {n-1\brace m-1} { m − 1 n − 1 } ),要么放入以前的一个装有球的盒子中(m { n − 1 m } m{n-1\brace m} m { m n − 1 } )。通过这个公式,可以 O ( n 2 ) O(n^2) O ( n 2 ) 求出前 n n n 行的第二类斯特林数。
现在考虑它的通项公式。考虑到若允许空盒,且盒子有标号,则方案数显然为 g ( m ) = m n g(m)=m^n g ( m ) = m n ,然后可以根据 f , g f,g f , g 的关系来二项式反演:
g ( m ) = m n = ∑ i = 0 m ( m i ) f ( i ) ⟹ f ( m ) = ∑ i = 0 m ( − 1 ) m − i ( m i ) g ( i ) ⟹ f ( m ) = ∑ i = 0 m ( − 1 ) m − i ( m i ) i n g(m)=m^n=\sum_{i=0}^{m}\binom{m}{i}f(i)\implies f(m)=\sum_{i=0}^{m}(-1)^{m-i}\binom{m}{i}g(i)\implies f(m)=\sum_{i=0}^{m}(-1)^{m-i}\binom{m}{i}i^n g ( m ) = m n = i = 0 ∑ m ( i m ) f ( i ) ⟹ f ( m ) = i = 0 ∑ m ( − 1 ) m − i ( i m ) g ( i ) ⟹ f ( m ) = i = 0 ∑ m ( − 1 ) m − i ( i m ) i n
其中 f ( i ) f(i) f ( i ) 表示不允许空盒,但 i i i 个盒子有标号的方案数。由于 { n m } = f ( m ) m ! {n\brace m}=\frac{f(m)}{m!} { m n } = m ! f ( m ) 所以可以求出第二类斯特林数的通项公式:
{ n m } = 1 m ! ∑ i = 0 m ( − 1 ) m − i ( m i ) i n \boxed{{n\brace m}=\frac{1}{m!}\sum_{i=0}^{m}(-1)^{m-i}\binom{m}{i}i^n} { m n } = m ! 1 i = 0 ∑ m ( − 1 ) m − i ( i m ) i n
通过这个公式,可以借助 FFT/NTT 加速卷积,在 O ( n log n ) O(n\log n) O ( n log n ) 的时间复杂度内求第 n n n 行的第二类斯特林数。
接下来考虑第二类斯特林数的列指数生成函数,即:
S ^ m ( z ) = 1 m ! ∑ n ≥ 0 ∑ i = 0 m ( − 1 ) m − i ( m i ) i n z n n ! = 1 m ! ∑ i = 0 m ( − 1 ) m − i ( m i ) ∑ n ≥ 0 z n i n n ! = 1 m ! ∑ i = 0 m ( − 1 ) m − i ( m i ) e i z = 1 m ! ( e z − 1 ) m \begin{aligned} \hat{\mathbf{S}}_m(z)&=\frac{1}{m!}\sum_{n\geq 0}\sum_{i=0}^{m}(-1)^{m-i}\binom{m}{i}i^n\frac{z^n}{n!}\\ &=\frac{1}{m!}\sum_{i=0}^{m}(-1)^{m-i}\binom{m}{i}\sum_{n\geq 0}\frac{z^ni^n}{n!}=\frac{1}{m!}\sum_{i=0}^{m}(-1)^{m-i}\binom{m}{i}e^{iz}\\ &=\boxed{\frac{1}{m!}(e^z-1)^m} \end{aligned} S ^ m ( z ) = m ! 1 n ≥ 0 ∑ i = 0 ∑ m ( − 1 ) m − i ( i m ) i n n ! z n = m ! 1 i = 0 ∑ m ( − 1 ) m − i ( i m ) n ≥ 0 ∑ n ! z n i n = m ! 1 i = 0 ∑ m ( − 1 ) m − i ( i m ) e i z = m ! 1 ( e z − 1 ) m
通过这个公式,可以 O ( n log n ) O(n\log n) O ( n log n ) 多项式快速幂算法求出第二类斯特林数某一列的前 n n n 项。
多项式快速幂:对于多项式 P ( z ) P(z) P ( z ) ,欲求 P k ( z ) P^k(z) P k ( z ) ,则按照 P ( z ) P(z) P ( z ) 的性质分类讨论:
若 P ( 0 ) = 1 P(0)=1 P ( 0 ) = 1 ,则 P k ( z ) = exp ( k ln ( P ( z ) ) ) P^k(z)=\exp(k\ln(P(z))) P k ( z ) = exp ( k ln ( P ( z ))) 。 若 P ( 0 ) ∉ { 0 , 1 } P(0)\not\in\{0,1\} P ( 0 ) ∈ { 0 , 1 } ,则 P k ( z ) = P ( 0 ) exp ( k ln ( ( P ( 0 ) ) − 1 ⋅ P ( z ) ) ) P^k(z)=P(0)\exp(k\ln((P(0))^{-1}\cdot P(z))) P k ( z ) = P ( 0 ) exp ( k ln (( P ( 0 ) ) − 1 ⋅ P ( z ))) 。 否则,令 P ′ ( z ) = z − 1 P ( z ) P'(z)=z^{-1}P(z) P ′ ( z ) = z − 1 P ( z ) ,则 P k ( z ) = z k ( P ′ ( z ) ) k P^k(z)=z^k(P'(z))^k P k ( z ) = z k ( P ′ ( z ) ) k ,至于 ( P ′ ( z ) ) k (P'(z))^k ( P ′ ( z ) ) k 则继续套用多项式快速幂即可。 这样就保证求 ln \ln ln 时,真多项式的常数项始终为 1 1 1 ,以便得到正确的结果。
时间复杂度 O ( n log n ) O(n\log n) O ( n log n ) 。
最后是第二类斯特林数的二元生成函数,即:
S ( x , y ) = ∑ m ≥ 0 y m S ^ m ( x ) = ∑ m ≥ 0 y m m ! ⋅ ( e x − 1 ) m = e y ( e x − 1 ) \begin{aligned} \mathbf{S}(x,y)&=\sum_{m\geq 0}y^m\hat{\mathbf{S}}_m(x)=\sum_{m\geq 0}\frac{y^m}{m!}\cdot (e^x-1)^m=\boxed{e^{y\left(e^x-1\right)}} \end{aligned} S ( x , y ) = m ≥ 0 ∑ y m S ^ m ( x ) = m ≥ 0 ∑ m ! y m ⋅ ( e x − 1 ) m = e y ( e x − 1 )
这个生成函数形式非常漂亮,易于记忆,但是(在 OI 中)实用价值不高,不过可以帮助记忆前一个结果。
注意我们没有提到第二类斯特林数的行生成函数,事实上第二类斯特林数的行生成函数与 Touchard 多项式或 Bell 多项式 有关,是较难处理的,故略去。
第一类斯特林数定义:[ n m ] {n\brack m} [ m n ] 表示将 n n n 个互相区分的小球放入 m m m 个互不区分的圆排列,使得圆排列均非空的方案数。
求第一类斯特林数的递推公式、行普通生成函数、列指数生成函数、二元生成函数(关于行为 OGF,关于列为 EGF)。
根据第一类斯特林数的定义,我们很容易写出它的递推公式:
[ n m ] = [ n − 1 m − 1 ] + ( n − 1 ) [ n − 1 m ] , [ n 0 ] = [ n = 0 ] \boxed{{n\brack m}={n-1 \brack m-1}+(n-1){n-1\brack m},{n\brack 0}=[n=0]} [ m n ] = [ m − 1 n − 1 ] + ( n − 1 ) [ m n − 1 ] , [ 0 n ] = [ n = 0 ]
证明是平凡的,考虑第 n n n 个小球,要么在一个新的圆排列中([ n − 1 m − 1 ] {n-1\brack m-1} [ m − 1 n − 1 ] ),要么接在某一个元素后面(( n − 1 ) [ n − 1 m ] (n-1){n-1\brack m} ( n − 1 ) [ m n − 1 ] )。
通过递推公式,可以 O ( n 2 ) O(n^2) O ( n 2 ) 求前 n n n 行的第一类斯特林数。
接下来求其行普通生成函数 s n ( z ) \mathbf{s}_n(z) s n ( z ) ,根据递推公式,我们有 s n ( z ) = z s n − 1 ( z ) + ( n − 1 ) s n − 1 ( z ) \mathbf{s}_n(z)=z\mathbf{s}_{n-1}(z)+(n-1)\mathbf{s}_{n-1}(z) s n ( z ) = z s n − 1 ( z ) + ( n − 1 ) s n − 1 ( z ) ,即 s n ( z ) = ( z + n − 1 ) s n − 1 ( z ) \mathbf{s}_n(z)=(z+n-1)\mathbf{s}_{n-1}(z) s n ( z ) = ( z + n − 1 ) s n − 1 ( z ) ,结合 s 0 ( z ) = 1 \mathbf{s}_0(z)=1 s 0 ( z ) = 1 可以直接推导出:
s n ( z ) = z n ‾ \boxed{\mathbf{s}_n(z)=z^{\overline{n}}} s n ( z ) = z n
使用倍增法 z n ‾ = z k ‾ ( z + k ) n − k ‾ z^{\overline{n}}=z^{\overline{k}}(z+k)^{\overline{n-k}} z n = z k ( z + k ) n − k 结合多项式点值平移技术,可以做到 O ( n log n ) O(n\log n) O ( n log n ) 求第一类斯特林数第 n n n 行的值。
多项式点值平移:对于 n n n 次多项式多项式 P ( z ) P(z) P ( z ) ,求多项式 P ( z + k ) P(z+k) P ( z + k ) 。为了方便,下面记 a i = [ z i ] P ( z ) a_i=[z^i]P(z) a i = [ z i ] P ( z ) ,则:
P ( z + k ) = ∑ i ≥ 0 a i ( z + k ) i = ∑ i ≥ 0 a i ∑ j = 0 i ( i j ) z j k i − j = ∑ j ≥ 0 z j ∑ i ≥ j ( i j ) a i k i − j = ∑ j ≥ 0 z j ∑ i ≥ j i ! j ! ( i − j ) ! a i k i − j = ∑ j ≥ 0 z j j ! ∑ i ≥ j a i i ! ⋅ k i − j ( i − j ) ! \begin{aligned} P(z+k)&=\sum_{i\geq 0} a_i(z+k)^i=\sum_{i\geq 0}a_i\sum_{j=0}^{i}\binom{i}{j}z^jk^{i-j}=\sum_{j\geq 0}z^j\sum_{i\geq j}\binom{i}{j}a_ik^{i-j}\\ &=\sum_{j\geq 0}z^j\sum_{i\geq j}\frac{i!}{j!(i-j)!}a_ik^{i-j}=\sum_{j\geq 0}\frac{z^j}{j!}\sum_{i\geq j} a_ii!\cdot \frac{k^{i-j}}{(i-j)!} \end{aligned} P ( z + k ) = i ≥ 0 ∑ a i ( z + k ) i = i ≥ 0 ∑ a i j = 0 ∑ i ( j i ) z j k i − j = j ≥ 0 ∑ z j i ≥ j ∑ ( j i ) a i k i − j = j ≥ 0 ∑ z j i ≥ j ∑ j ! ( i − j )! i ! a i k i − j = j ≥ 0 ∑ j ! z j i ≥ j ∑ a i i ! ⋅ ( i − j )! k i − j
令 f ( i ) = a i i ! , g ( i ) = k i i ! f(i)=a_ii!,g(i)=\frac{k^i}{i!} f ( i ) = a i i ! , g ( i ) = i ! k i ,代入化简:
P ( z + k ) = ∑ j ≥ 0 z j j ! ∑ i ≥ j f ( i ) g ( i − j ) = ∑ j ≥ 0 z j j ! ∑ i = 0 n − j f ( i + j ) g ( i ) = ∑ j ≥ 0 z j j ! ∑ i = 0 n − j f ′ ( n − i − j ) g ( i ) \begin{aligned} P(z+k)&=\sum_{j\geq 0}\frac{z^j}{j!}\sum_{i\geq j} f(i)g(i-j)=\sum_{j\geq 0}\frac{z^j}{j!}\sum_{i=0}^{n-j} f(i+j)g(i)=\sum_{j\geq 0}\frac{z^j}{j!}\sum_{i=0}^{n-j} f'(n-i-j)g(i) \end{aligned} P ( z + k ) = j ≥ 0 ∑ j ! z j i ≥ j ∑ f ( i ) g ( i − j ) = j ≥ 0 ∑ j ! z j i = 0 ∑ n − j f ( i + j ) g ( i ) = j ≥ 0 ∑ j ! z j i = 0 ∑ n − j f ′ ( n − i − j ) g ( i )
其中 f ′ ( i ) = f ( n − i ) f'(i)=f(n-i) f ′ ( i ) = f ( n − i ) 。这样末尾的和式就是卷积的形式,可以用 FFT/NTT 优化。时间复杂度 O ( n log n ) O(n\log n) O ( n log n ) 。
然后是求其列指数生成函数 s ^ m ( z ) \hat{\mathbf{s}}_m(z) s ^ m ( z ) 。考虑第一类斯特林数的组合意义,可以写出下面的等式:
1 n ! [ n m ] = 1 m ! [ z n ] ( ∑ i ≥ 1 ( i − 1 ) ! z i i ! ) m \frac{1}{n!}{n\brack m}=\frac{1}{m!}[z^n]\left(\sum_{i\geq 1}(i-1)!\frac{z^i}{i!}\right)^m n ! 1 [ m n ] = m ! 1 [ z n ] ( i ≥ 1 ∑ ( i − 1 )! i ! z i ) m
这之中的原因是长为 i i i 的圆排列有 ( i − 1 ) ! (i-1)! ( i − 1 )! 种,那么写出每一个圆排列的指数生成函数(不妨先假定圆排列之间区分,这样放入的小球在自然也就区分了)∑ i ≥ 1 ( i − 1 ) ! z i i ! \sum_{i\geq 1}(i-1)!\frac{z^i}{i!} ∑ i ≥ 1 ( i − 1 )! i ! z i ,m m m 次幂后除以顺序系数 m ! m! m ! 就是答案。
根据这个等式可以立即写出 s ^ m ( z ) \hat{\mathbf{s}}_m(z) s ^ m ( z ) 的表达式:
s ^ m ( z ) = 1 m ! ( ∑ i ≥ 1 ( i − 1 ) ! z i i ! ) m = 1 m ! ( ∑ i ≥ 1 z i i ) m = 1 m ! ( − ∑ i ≥ 1 ( − z ) i ( − 1 ) i + 1 i ) m = 1 m ! ( − ln ( 1 − z ) ) m = 1 m ! ( − 1 ) m ln m ( 1 − z ) \begin{aligned} \hat{\mathbf{s}}_m(z)&=\frac{1}{m!}\left(\sum_{i\geq 1}(i-1)!\frac{z^i}{i!}\right)^m=\frac{1}{m!}\left(\sum_{i\geq 1}\frac{z^i}{i}\right)^m\\ &=\frac{1}{m!}\left(-\sum_{i\geq 1}\frac{(-z)^i(-1)^{i+1}}{i}\right)^m=\frac{1}{m!}\left(-\ln(1-z)\right)^m=\boxed{\frac{1}{m!}(-1)^m\ln^m(1-z)} \end{aligned} s ^ m ( z ) = m ! 1 ( i ≥ 1 ∑ ( i − 1 )! i ! z i ) m = m ! 1 ( i ≥ 1 ∑ i z i ) m = m ! 1 ( − i ≥ 1 ∑ i ( − z ) i ( − 1 ) i + 1 ) m = m ! 1 ( − ln ( 1 − z ) ) m = m ! 1 ( − 1 ) m ln m ( 1 − z )
事实上大多数时候我们只需要做到第一步即可,可以对 ∑ i ≥ 1 z i i \sum_{i\geq 1}\frac{z^i}{i} ∑ i ≥ 1 i z i 多项式快速幂,O ( n log n ) O(n\log n) O ( n log n ) 时间复杂度内求第一类斯特林数某一列的前 n n n 项。
仿照我们推导第二类斯特林数的二元生成函数的过程,同样可以求出第一类斯特林数的二元生成函数:
s ( x , y ) = ∑ i ≥ 0 y i s ^ m ( x ) = ∑ i ≥ 0 y i 1 i ! ( − 1 ) i ln i ( 1 − x ) = ∑ i ≥ 0 ( − y ln ( 1 − x ) ) i i ! = e − y ln ( 1 − x ) \mathbf{s}(x,y)=\sum_{i\geq 0} y^i\hat{\mathbf{s}}_m(x)=\sum_{i\geq 0}y^i\frac{1}{i!}(-1)^i\ln^i(1-x)=\sum_{i\geq 0}\frac{(-y\ln(1-x))^i}{i!}=\boxed{e^{-y\ln(1-x)}} s ( x , y ) = i ≥ 0 ∑ y i s ^ m ( x ) = i ≥ 0 ∑ y i i ! 1 ( − 1 ) i ln i ( 1 − x ) = i ≥ 0 ∑ i ! ( − y ln ( 1 − x ) ) i = e − y l n ( 1 − x )
这个结果同样非常易于记忆,但是在 OI 种的用途大概也只有方便推列指数生成函数了吧。
普通幂、上升幂和下降幂可以通过斯特林数进行转换,这里给出六个公式:
上升幂转普通幂 下降幂转普通幂 x n ‾ = ∑ i ≥ 0 [ n i ] x i x^{\overline{n}}=\sum\limits_{i\geq 0}{n\brack i}x^i x n = i ≥ 0 ∑ [ i n ] x i x n ‾ = ∑ i ≥ 0 [ n i ] ( − 1 ) n − i x i x^{\underline{n}}=\sum\limits_{i\geq 0}{n\brack i}(-1)^{n-i}x^i x n = i ≥ 0 ∑ [ i n ] ( − 1 ) n − i x i 普通幂转上升幂 普通幂转下降幂 x n = ∑ i ≥ 0 { n i } ( − 1 ) n − i x i ‾ x^n=\sum\limits_{i\geq 0} {n\brace i}(-1)^{n-i}x^{\overline{i}} x n = i ≥ 0 ∑ { i n } ( − 1 ) n − i x i x n = ∑ i ≥ 0 { n i } x i ‾ x^n=\sum\limits_{i\geq 0}{n\brace i}x^{\underline{i}} x n = i ≥ 0 ∑ { i n } x i 上升幂转下降幂 下降幂转上升幂 x n ‾ = ( − 1 ) n ( − x ) n ‾ x^{\overline{n}}=(-1)^n(-x)^{\underline{n}} x n = ( − 1 ) n ( − x ) n x n ‾ = ( − 1 ) n ( − x ) n ‾ x^{\underline{n}}=(-1)^n(-x)^{\overline{n}} x n = ( − 1 ) n ( − x ) n
其中上升幂转普通幂已经在第一类斯特林数的行生成函数中证明。这里将证明余下五个。
上升幂转下降幂 :
x n ‾ = ∏ i = 0 n − 1 x + i = ( − 1 ) n ∏ i = 0 n − 1 − x − i = ( − 1 ) n ( − x ) n ‾ x^{\overline{n}}=\prod_{i=0}^{n-1}x+i=(-1)^n\prod_{i=0}^{n-1}-x-i=(-1)^n(-x)^{\underline{n}} x n = i = 0 ∏ n − 1 x + i = ( − 1 ) n i = 0 ∏ n − 1 − x − i = ( − 1 ) n ( − x ) n
下降幂转上升幂是类似的。
下降幂转普通幂 :
x n ‾ = ( − 1 ) n ( − x ) n ‾ = ( − 1 ) n ∑ i ≥ 0 [ n i ] ( − x ) i = ( − 1 ) n ∑ i ≥ 0 [ n i ] ( − 1 ) i x i = ∑ i ≥ 0 [ n i ] ( − 1 ) n − i x i x^{\underline{n}}=(-1)^{n}(-x)^{\overline{n}}=(-1)^n\sum_{i\geq 0}{n\brack i}(-x)^i=(-1)^n\sum_{i\geq 0}{n\brack i}(-1)^ix^i=\sum_{i\geq 0}{n\brack i}(-1)^{n-i}x^i x n = ( − 1 ) n ( − x ) n = ( − 1 ) n i ≥ 0 ∑ [ i n ] ( − x ) i = ( − 1 ) n i ≥ 0 ∑ [ i n ] ( − 1 ) i x i = i ≥ 0 ∑ [ i n ] ( − 1 ) n − i x i
普通幂转下降幂 :右侧的和式可以看成有 x x x 个盒子,选出 i i i 个盒子非空,有 x i ‾ x^{\underline{i}} x i 种,将 n n n 个球放入盒子中使得每个盒子非空的方案数是 { n i } {n\brace i} { i n } ,故右侧的和式的意义是将 n n n 个互相区分的小球放入 x x x 个互相区分的盒子,不加任何其他限制的方案数。而这个方案数的答案就是左侧的 x n x^n x n ,故该等式成立。这个证明很容易推广到 x ∈ R x\in\mathbb{R} x ∈ R 的情况。
普通幂转上升幂 :
x n = ( − 1 ) n ( − x ) n = ( − 1 ) n ∑ i ≥ 0 { n i } ( − x ) i ‾ = ( − 1 ) n ∑ i ≥ 0 { n i } ( − 1 ) i x i ‾ = ∑ i ≥ 0 { n i } ( − 1 ) n − i x i ‾ x^n=(-1)^n(-x)^n=(-1)^n\sum_{i\geq 0}{n\brace i} (-x)^{\underline{i}}=(-1)^n\sum_{i\geq 0}{n\brace i}(-1)^ix^{\overline{i}}=\sum_{i\geq 0}{n\brace i}(-1)^{n-i}x^{\overline{i}} x n = ( − 1 ) n ( − x ) n = ( − 1 ) n i ≥ 0 ∑ { i n } ( − x ) i = ( − 1 ) n i ≥ 0 ∑ { i n } ( − 1 ) i x i = i ≥ 0 ∑ { i n } ( − 1 ) n − i x i
另外值得一提的是,普通幂、上升幂和下降幂有一个共性——都满足二项式定理:
( a + b ) n = ∑ i ≥ 0 ( n i ) a i b n − i ( a + b ) n ‾ = ∑ i ≥ 0 ( n i ) a i ‾ b n − i ‾ ( a + b ) n ‾ = ∑ i ≥ 0 ( n i ) a i ‾ b n − i ‾ \boxed{\begin{aligned} &(a+b)^n=\sum_{i\geq 0} \binom{n}{i} a^i b^{n-i}\\ &(a+b)^{\underline{n}}=\sum_{i\geq 0}\binom{n}{i} a^{\underline{i}} b^{\underline{n-i}}\\ &(a+b)^{\overline{n}}=\sum_{i\geq 0}\binom{n}{i}a^{\overline{i}}b^{\overline{n-i}} \end{aligned}} ( a + b ) n = i ≥ 0 ∑ ( i n ) a i b n − i ( a + b ) n = i ≥ 0 ∑ ( i n ) a i b n − i ( a + b ) n = i ≥ 0 ∑ ( i n ) a i b n − i
证明:对于下降幂的二项式定理,等式左侧可以看成 a + b a+b a + b 个数中,选 n n n 个数的形成的排列数,而右侧可以看成将 a + b a+b a + b 个数分成两组,甲组 a a a 个数乙组 b b b 个数,枚举甲组选择 i i i 个数,则方案数为 a i ‾ a^{\underline{i}} a i ,同理乙组方案数为 b n − i ‾ b^{\underline{n-i}} b n − i 。最后在排列的 i i i 个位置分配给甲组,剩余分配给乙组即可,这一部分方案数是 ( n i ) \binom{n}{i} ( i n ) 。故等式两边求的是同一个东西,所以相等。这个证明很容易推广到 a , b ∈ R a,b\in\mathbb{R} a , b ∈ R 的情况。
对于上升幂的二项式定理,只需要将上升幂转成下降幂即可。
证明反转公式:
∑ i ≥ 0 [ n i ] { i m } ( − 1 ) n − i = ∑ i ≥ 0 { n i } [ i m ] ( − 1 ) n − i = [ n = m ] \sum_{i\geq 0} {n\brack i}{i \brace m}(-1)^{n-i}=\sum_{i\geq 0} {n\brace i}{i \brack m}(-1)^{n-i}=[n=m] i ≥ 0 ∑ [ i n ] { m i } ( − 1 ) n − i = i ≥ 0 ∑ { i n } [ m i ] ( − 1 ) n − i = [ n = m ]
我们以证明连等式第二项和第三项相等为例,第一项与第三项相等是类似的:
x n = ∑ i ≥ 0 { n i } ( − 1 ) n − i x i ‾ = ∑ i ≥ 0 { n i } ( − 1 ) n − i ∑ m ≥ 0 [ i m ] x m = ∑ m ≥ 0 x m ∑ i ≥ 0 { n i } [ i m ] ( − 1 ) n − i ⟹ ∑ i ≥ 0 { n i } [ i m ] ( − 1 ) n − i = [ n = m ] \begin{aligned} x^n&=\sum_{i\geq 0}{n\brace i}(-1)^{n-i}x^{\overline{i}}=\sum_{i\geq 0}{n\brace i}(-1)^{n-i}\sum_{m\geq 0} {i\brack m}x^m=\sum_{m\geq 0}x^m\sum_{i\geq 0} {n\brace i}{i\brack m}(-1)^{n-i}\\ &\implies \sum_{i\geq 0} {n\brace i}{i\brack m}(-1)^{n-i}=[n=m] \end{aligned} x n = i ≥ 0 ∑ { i n } ( − 1 ) n − i x i = i ≥ 0 ∑ { i n } ( − 1 ) n − i m ≥ 0 ∑ [ m i ] x m = m ≥ 0 ∑ x m i ≥ 0 ∑ { i n } [ m i ] ( − 1 ) n − i ⟹ i ≥ 0 ∑ { i n } [ m i ] ( − 1 ) n − i = [ n = m ]
反转公式看起来就很像莫比乌斯反演公式和单位根反演公式,这引导我们构造类似的反演形式。
证明斯特林反演:
f ( n ) = ∑ i ≥ 0 { n i } g ( i ) ⟺ g ( n ) = ∑ i ≥ 0 ( − 1 ) n − i [ n i ] f ( i ) f(n)=\sum_{i\geq 0}{n\brace i}g(i)\iff g(n)=\sum_{i\geq 0}(-1)^{n-i}{n \brack i}f(i) f ( n ) = i ≥ 0 ∑ { i n } g ( i ) ⟺ g ( n ) = i ≥ 0 ∑ ( − 1 ) n − i [ i n ] f ( i )
证明?其实就是反转公式 + 克罗内克函数描述的矩阵反演啦!可以参考 算法|斯特林数、容斥和反演整理 - 知乎 。
UOJ 540. 【统一省选2020】组合数问题 :给定一个 m m m 次多项式 f ( x ) = a 0 + a 1 x + ⋯ + a m x m f(x)=a_{0}+a_{1}x+\cdots+a_{m}x^{m} f ( x ) = a 0 + a 1 x + ⋯ + a m x m 。
给出 n , x , p , m n,x,p,m n , x , p , m ,你需要求出:
∑ k = 0 n ( n k ) f ( k ) x k ( m o d p ) \sum_{k=0}^{n}\binom{n}{k}f(k)x^{k}\pmod{p} k = 0 ∑ n ( k n ) f ( k ) x k ( mod p )
1 ≤ n , x , p ≤ 10 9 , 0 ≤ m ≤ min ( n , 10 3 ) 1\leq n,x,p\leq 10^{9},0\leq m\leq\min(n,10^{3}) 1 ≤ n , x , p ≤ 1 0 9 , 0 ≤ m ≤ min ( n , 1 0 3 )
大力推式子:
∑ k = 0 n x k ( n k ) ∑ t = 0 m a t k t = ∑ t = 0 m a t ∑ k = 0 n k t x k ( n k ) = ∑ t = 0 m a t ∑ k = 0 n x k ( n k ) ∑ i = 0 t { t i } ( k i ) i ! = ∑ t = 0 m a t ∑ i = 0 t { t i } i ! ∑ k = 0 n ( n k ) ( k i ) x k = ∑ t = 0 m a t ∑ i = 0 t { t i } ( n i ) i ! ∑ k = 0 n ( n − i k − i ) x k = ∑ t = 0 m a t ∑ i = 0 t { t i } ( n i ) i ! x i ∑ k = 0 n − i ( n − i k ) x k = ∑ t = 0 m a t ∑ i = 0 t { t i } ( n i ) i ! x i ( 1 + x ) n − i = ∑ t = 0 m a t ∑ i = 0 t { t i } x i ( 1 + x ) n − i n i ‾ \begin{aligned} &\sum_{k=0}^{n}x^{k}\binom{n}{k}\sum_{t=0}^{m}a_{t}k^{t}\\ =&\sum_{t=0}^{m}a_{t}\sum_{k=0}^{n}k^{t}x^{k}\binom{n}{k}=\sum_{t=0}^{m}a_{t}\sum_{k=0}^{n}x^{k}\binom{n}{k}\sum_{i=0}^{t}\begin{Bmatrix}t\\i\end{Bmatrix}\binom{k}{i}i!\\ =&\sum_{t=0}^{m}a_{t}\sum_{i=0}^{t}\begin{Bmatrix}t\\i\end{Bmatrix}i!\sum_{k=0}^{n}\binom{n}{k}\binom{k}{i}x^{k}=\sum_{t=0}^{m}a_{t}\sum_{i=0}^{t}\begin{Bmatrix}t\\i\end{Bmatrix}\binom{n}{i}i!\sum_{k=0}^{n}\binom{n-i}{k-i}x^{k}\\ =&\sum_{t=0}^{m}a_{t}\sum_{i=0}^{t}\begin{Bmatrix}t\\i\end{Bmatrix}\binom{n}{i}i!x^{i}\sum_{k=0}^{n-i}\binom{n-i}{k}x^{k}\\ =&\sum_{t=0}^{m}a_{t}\sum_{i=0}^{t}\begin{Bmatrix}t\\i\end{Bmatrix}\binom{n}{i}i!x^{i}(1+x)^{n-i}=\sum_{t=0}^{m}a_{t}\sum_{i=0}^{t}\begin{Bmatrix}t\\i\end{Bmatrix}x^{i}(1+x)^{n-i}n^{\underline{i}} \end{aligned} = = = = k = 0 ∑ n x k ( k n ) t = 0 ∑ m a t k t t = 0 ∑ m a t k = 0 ∑ n k t x k ( k n ) = t = 0 ∑ m a t k = 0 ∑ n x k ( k n ) i = 0 ∑ t { t i } ( i k ) i ! t = 0 ∑ m a t i = 0 ∑ t { t i } i ! k = 0 ∑ n ( k n ) ( i k ) x k = t = 0 ∑ m a t i = 0 ∑ t { t i } ( i n ) i ! k = 0 ∑ n ( k − i n − i ) x k t = 0 ∑ m a t i = 0 ∑ t { t i } ( i n ) i ! x i k = 0 ∑ n − i ( k n − i ) x k t = 0 ∑ m a t i = 0 ∑ t { t i } ( i n ) i ! x i ( 1 + x ) n − i = t = 0 ∑ m a t i = 0 ∑ t { t i } x i ( 1 + x ) n − i n i
这个式子显然可以 O ( m 2 log n ) O(m^2\log n) O ( m 2 log n ) 计算(精细的实现也许可以做到 O ( m 2 ) O(m^2) O ( m 2 ) ?),这个时间复杂度完全可以承受。