组合数学
- n n n 个无标号小球放入 m m m 个无标号盒子中,设答案为 f n , m f_{n,m} fn,m,转移即讨论第一个盒子是否放球:
f 0 , i = 1 , f i , j = f i , j − 1 + f i − j , j f_{0,i} = 1, f_{i,j} = f_{i,j - 1} + f_{i - j, j} f0,i=1,fi,j=fi,j−1+fi−j,j
- 若要求每个盒子中至少放一个,则答案为 f n − m , m f_{n - m,m} fn−m,m,枚举 m m m 求和即 分拆数。
- 结论1 ∑ i = 0 m ( k + i k ) = ( k + m + 1 k + 1 ) \sum \limits_{i = 0}^{m} \binom{k + i}{k} = \binom{k + m + 1}{k + 1} i=0∑m(kk+i)=(k+1k+m+1)
∑ i = 0 m ( k + i k ) = ( k + 1 k + 1 ) + ( k + 1 k ) + ∑ i = 2 m ( k + i k ) = ( k + 2 k + 1 ) + ( k + 2 k ) + ∑ i = 3 m ( k + i k ) = … = ( k + m + 1 k + 1 ) \begin{aligned} \sum \limits_{i = 0}^{m} \binom{k + i}{k} &= \binom{k + 1}{k + 1} + \binom{k + 1}{k}+\sum\limits_{i = 2}^{m}\binom{k + i}{k} \\ &= \binom{k + 2}{k + 1} + \binom{k+2}{k} + \sum\limits_{i = 3}^{m}\binom{k + i}{k} \\ &= \dots \\ &= \binom{k + m + 1}{k + 1}\\ \end{aligned} i=0∑m(kk+i)=(k+1k+1)+(kk+1)+i=2∑m(kk+i)=(k+1k+2)+(kk+2)+i=3∑m(kk+i)=…=(k+1k+m+1)
-
结论2 对于斐波拉契数列 F n ( F 0 = 0 , F 1 = 1 , F n = F n − 1 + F n − 2 ) F_n(F_0 = 0,F_1=1, F_n = F_{n - 1} + F_{n - 2}) Fn(F0=0,F1=1,Fn=Fn−1+Fn−2), 有:
F n = ∑ k = 0 n − 1 ( n − 1 − k k ) F_n = \sum \limits_{k = 0}^{n - 1}\binom{n - 1 - k}{k} Fn=k=0∑n−1(kn−1−k)
证明 易知 F 0 = 0 , F 1 = 1 F_0 = 0,F_1 = 1 F0=0,F1=1,对于 n ≥ 2 n\ge 2 n≥2,考虑归纳证明
F n = F n − 1 + F n − 2 = ( n − 2 0 ) + ∑ k = 1 n − 2 ( n − 2 − k k ) + ∑ k = 1 n − 2 ( n − 2 − k k − 1 ) = ( n − 1 0 ) + ∑ k = 1 n − 2 ( n − 1 − k k ) + ( 0 n − 1 ) = ∑ k = 0 n − 1 ( n − 1 − k k ) \begin{aligned} F_{n} &= F_{n - 1} + F_{n - 2} \\ &= \binom{n - 2}{0} + \sum \limits_{k = 1}^{n - 2}\binom{n - 2 - k}{k} + \sum \limits_{k = 1}^{n - 2}\binom{n - 2 - k}{k - 1} \\ &= \binom{n - 1}{0} + \sum \limits_{k = 1}^{n - 2}\binom{n - 1 - k}{k} + \binom{0}{n - 1} \\ &= \sum \limits_{k = 0}^{n - 1}\binom{n - 1 - k}{k} \\ \end{aligned} Fn=Fn−1+Fn−2=(0n−2)+k=1∑n−2(kn−2−k)+k=1∑n−2(k−1n−2−k)=(0n−1)+k=1∑n−2(kn−1−k)+(n−10)=k=0∑n−1(kn−1−k)
-
范德蒙德卷积 ∑ i = 0 k ( n i ) ( m k − i ) = ( n + m k ) \sum \limits_{i = 0}^{k}\binom{n}{i}\binom{m}{k - i} = \binom{n+m}{k} i=0∑k(in)(k−im)=(kn+m)
- 推论1 ∑ i = 0 min { n , m } ( n i ) ( m i ) = ( n + m n ) = ( n + m m ) \sum \limits_{i = 0}^{\min\{n,m\}}\binom{n}{i}\binom{m}{i} = \binom{n+m}{n} = \binom{n + m}{m} i=0∑min{n,m}(in)(im)=(nn+m)=(mn+m)(利用 ( n i ) = ( n n − i ) \binom{n}{i} = \binom{n}{n - i} (in)=(n−in))。
- 推论2 ∑ i = 0 n ( n i ) ( m i + k ) = ∑ i = 0 n ( n n − i ) ( m i + k ) = ( n + m n + k ) \sum \limits_{i = 0}^{n}\binom{n}{i}\binom{m}{i+k} = \sum \limits_{i = 0}^{n}\binom{n}{n - i}\binom{m}{i+k} = \binom{n + m}{n + k} i=0∑n(in)(i+km)=i=0∑n(n−in)(i+km)=(n+kn+m)
鸽巢原理
- 将 n + 1 n + 1 n+1 个物体,划分为 n n n 组,至少有一组有两个或以上的物体。
- 将 n n n 个物体,划分为 k k k 组,至少存在一个分组,含有至少 ⌈ n k ⌉ \lceil \frac{n}{k} \rceil ⌈kn⌉ 个物体。
典例 2022牛客多校10I
题目大意
- 给定数组 a , b a,b a,b,长度分别为 n , m n,m n,m,询问能够找到一组 i , j , k , l i,j,k,l i,j,k,l,满足 i ≠ j , k ≠ l , ∣ a i − a j ∣ = ∣ b k − b l ∣ i\not = j,k\not = l,|a_i - a_j| = |b_k - b_l| i=j,k=l,∣ai−aj∣=∣bk−bl∣。
- 2 ≤ n , m ≤ 1 0 6 , 0 ≤ a i , b i ≤ 1 0 7 2 \le n, m\le 10^6, 0 \le a_i,b_i\le 10^7 2≤n,m≤106,0≤ai,bi≤107。
题解
- 若 a , b a,b a,b 均有重复元素,显然有解,否则将 a , b a,b a,b 排序后去重。
- 原式去掉绝对值后移项可变为 a i + b l = a j + b k a_i + b_l = a_j + b_k ai+bl=aj+bk,由鸽巢原理, a j + b k a_j + b_k aj+bk 的值两两不同的情况最多只有 2 × 1 0 7 2 \times 10^7 2×107 种,暴力枚举即可。
Ramsey 数
-
定义 r ( m , n ) r(m, n) r(m,n) 表示满足以下条件的完全图的最少点数 n n n:
- 将图的所有边染为红蓝两种颜色之一。
- 无论如何染色,图中至少存在一个边全为红色的 K m K_m Km 或者边全为蓝色的 K n K_n Kn。
-
由定义可知 r ( n , m ) = r ( m , n ) , r ( 1 , n ) = 1 r(n, m) = r(m,n),r(1,n)=1 r(n,m)=r(m,n),r(1,n)=1。
-
利用鸽巢原理容易证明 r ( 3 , 3 ) ≤ 6 r(3,3)\le 6 r(3,3)≤6, r ( 3 , 3 ) > 5 r(3,3) > 5 r(3,3)>5 的反例如下图,实际上任取一个五元环即可。

-
可以证明 r ( 2 , n ) = n r(2,n)=n r(2,n)=n:
- 证明 r ( 2 , n ) > n − 1 r(2,n) > n - 1 r(2,n)>n−1,显然我们可以将 K n − 1 K_{n - 1} Kn−1 的所有边都染成蓝色而符合条件。
- 证明 r ( 2 , n ) ≤ n r(2,n) \le n r(2,n)≤n,显然 K n K_n Kn 所有边全为蓝色和其中至少存在一个边全为红色的 K 2 K_2 K2 ,两个条件总是至少有一个成立。
-
结论 r ( n , m ) ≤ r ( n − 1 , m ) + r ( n , m − 1 ) r(n,m) \le r(n-1,m)+r(n,m-1) r(n,m)≤r(n−1,m)+r(n,m−1)
证明 设 p = r ( n − 1 , m ) + r ( n , m − 1 ) p = r(n - 1, m) + r(n,m - 1) p=r(n−1,m)+r(n,m−1),任取 p p p 个点中的一个点 x x x,设 R x R_x Rx 表示与 x x x 相连的边均为红色的点集, B x B_x Bx 表示与 x x x 相连的边均为蓝色的点集,易知 ∣ R x ∣ + ∣ B x ∣ = p − 1 |R_x| + |B_x| = p - 1 ∣Rx∣+∣Bx∣=p−1。
由鸽巢原理,一定存在以下两个条件之一成立:
-
∣ R x ∣ ≥ r ( n − 1 , m ) |R_x| \ge r(n - 1,m) ∣Rx∣≥r(n−1,m)
-
∣ B x ∣ ≥ r ( n , m − 1 ) |B_x| \ge r(n, m - 1) ∣Bx∣≥r(n,m−1)
对于条件 1,在 R x R_x Rx 中任取 r ( n − 1 , m ) r(n - 1, m) r(n−1,m) 个点,由 r ( n − 1 , m ) r(n - 1, m) r(n−1,m) 的定义至少存在一个边全为红色的 K n − 1 K_{n - 1} Kn−1 或边全为蓝色的 K m K_{m} Km。若存在一个边全为蓝色的 K m K_m Km,证明已经完成;若存在一个边全为红色的 K n − 1 K_{n - 1} Kn−1,将 x x x 加入即可得到边全为红色的 K n K_n Kn。
对于条件2,同理可证。
- 推论 若 r ( n − 1 , m ) r(n - 1,m) r(n−1,m) 和 r ( n , m − 1 ) r(n,m - 1) r(n,m−1) 均为偶数,则 r ( n , m ) ≤ r ( n − 1 , m ) + r ( n , m − 1 ) − 1 r(n,m) \le r(n - 1,m) + r(n,m-1) - 1 r(n,m)≤r(n−1,m)+r(n,m−1)−1
证明 沿用 结论 中证明的定义,此时 ∣ R x ∣ + ∣ B x ∣ = p − 2 |R_x| + |B_x| = p - 2 ∣Rx∣+∣Bx∣=p−2。
由鸽巢定理,一定存在以下三个条件之一成立:
-
∣ R x ∣ ≥ r ( n − 1 , m ) |R_x| \ge r(n - 1,m) ∣Rx∣≥r(n−1,m)
-
∣ B x ∣ ≥ r ( n , m − 1 ) |B_x| \ge r(n, m - 1) ∣Bx∣≥r(n,m−1)
-
∣ R x ∣ = r ( n − 1 , m ) − 1 |R_x| = r(n - 1,m) - 1 ∣Rx∣=r(n−1,m)−1 且 ∣ B x ∣ = r ( n , m − 1 ) − 1 |B_x| = r(n, m - 1) - 1 ∣Bx∣=r(n,m−1)−1
前两个条件已经被证明,该推论可能不成立当且仅当对于所有点都满足条件 3,然而若所有点都满足条件 3 时由握手定理,图中的红边总数为 ( r ( n − 1 , m ) − 1 ) ( p − 1 ) 2 \frac{(r(n - 1,m) - 1)(p - 1)}{2} 2(r(n−1,m)−1)(p−1) ,由奇偶性该式一定不为整数,故至少存在一个点不满足条件 3。
证明 构造一个 n − 1 n - 1 n−1 行 m − 1 m - 1 m−1 列的点阵,同行的点之间连红边,否则连蓝边,显然图中不存在边全为红色的 K n − 1 K_{n - 1} Kn−1 和边全为蓝色的 K m − 1 K_{m - 1} Km−1。
- 将 Ramsey 数的概念推广到 k k k 染色,不难得到 r ( x 1 , x 2 , … , x k ) r(x_1,x_2,\dots,x_k) r(x1,x2,…,xk) 的定义。
- 结论3 r ( x 1 , x 2 , … , x k ) ≤ r ( x 1 , x 2 , … , x k − 2 , r ( x k − 1 , x k ) ) r(x_1,x_2,\dots,x_k) \le r(x_1,x_2,\dots,x_{k-2},r(x_{k - 1},x_k)) r(x1,x2,…,xk)≤r(x1,x2,…,xk−2,r(xk−1,xk))
证明 根据定义讨论即可。
- Sum-Free 划分 将集合 { 1 , 2 , … , n } \{1,2,\dots,n\} {1,2,…,n} 划分成 k k k 个集合,使得每个集合中不存在两个数 x , y x,y x,y( x x x 和 y y y 可相等),使得 x + y x + y x+y 也在这一集合中。
- 结论4 设 s k s_k sk 表示关于参数 k k k 最小的不能进行 Sum-Free 划分 的 n n n,则 s k < r ( 3 , … , 3 ) ( k 个 3 ) s_k < r(3,\dots,3)(k个3) sk<r(3,…,3)(k个3)
证明 设 X = r ( 3 , … , 3 ) ( k 个 3 ) X = r(3,\dots,3)(k个3) X=r(3,…,3)(k个3),将 { 1 , 2 , … , X − 1 } \{1,2,\dots,X-1\} {1,2,…,X−1} 划分成 k k k 个集合 R 1 , R 2 , … , R k R_1,R_2,\dots,R_k R1,R2,…,Rk, 对于任意结点编号 i , j ∈ { 1 , 2 , … , X } i,j\in\{1,2,\dots,X\} i,j∈{1,2,…,X},若 ∣ i − j ∣ ∈ R l |i - j|\in R_l ∣i−j∣∈Rl,则将 ( i , j ) (i,j) (i,j) 染为颜色 l l l,由 X X X 的定义图中至少存在一个边同色的 K 3 K_3 K3,设编号为 i < j < k ii<j<k,则有 ∣ j − i ∣ + ∣ k − j ∣ = ∣ k − i ∣ |j-i|+|k-j|=|k-i| ∣j−i∣+∣k−j∣=∣k−i∣,与 Sum-Free 划分 的定义矛盾。
二项式反演
- 结论 给定 k ∈ N k \in \mathbb N k∈N,则存在以下关系式
g k = ∑ i = k n ( i k ) f i ⇔ f k = ∑ i = k n ( − 1 ) i − k ( i k ) g i g_k = \sum \limits_{i = k}^{n} \binom{i}{k}f_i \Leftrightarrow f_k = \sum \limits_{i = k}^{n} (-1)^{i - k} \binom{i}{k}g_i gk=i=k∑n(ki)fi⇔fk=i=k∑n(−1)i−k(ki)gi
证明
∑ i = k n ( − 1 ) i − k ( i k ) g i = ∑ i = k n ( − 1 ) i − k ( i k ) ∑ j = i n ( j i ) f j = ∑ j = k n f j ∑ i = k j ( − 1 ) i − k ( i k ) ( j i ) = ∑ j = k n f j ∑ i = k j ( − 1 ) i − k ( j k ) ( j − k i − k ) = ∑ j = k n ( j k ) f j ∑ i = 0 j − k ( − 1 ) i ( j − k i ) = ∑ j = k n ( j k ) f j ( 1 − 1 ) j − k = ∑ j = k n ( j k ) f j [ j = k ] = f k \begin{aligned}\sum \limits_{i = k}^{n} (-1)^{i - k} \binom{i}{k}g_i &= \sum \limits_{i = k}^{n}(-1)^{i - k} \binom{i}{k} \sum \limits_{j = i}^{n} \binom{j}{i} f_j \\&= \sum \limits_{j = k}^{n} f_j\sum \limits_{i = k}^{j} (-1)^{i - k} \binom{i}{k}\binom{j}{i}\\&= \sum \limits_{j = k}^{n} f_j\sum \limits_{i = k}^{j} (-1)^{i - k} \binom{j}{k}\binom{j - k}{i - k}\\&= \sum \limits_{j = k}^{n} \binom{j}{k} f_j \sum \limits_{i = 0}^{j - k} (-1)^{i} \binom{j - k}{i}\\&= \sum \limits_{j = k}^{n} \binom{j}{k} f_j (1 - 1)^{j - k}\\&=\sum \limits_{j = k}^{n}\binom{j}{k}f_j[j = k] =f_k \end{aligned} i=k∑n(−1)i−k(ki)gi=i=k∑n(−1)i−k(ki)j=i∑n(ij)fj=j=k∑nfji=k∑j(−1)i−k(ki)(ij)=j=k∑nfji=k∑j(−1)i−k(kj)(i−kj−k)=j=k∑n(kj)fji=0∑j−k(−1)i(ij−k)=j=k∑n(kj)fj(1−1)j−k=j=k∑n(kj)fj[j=k]=fk
第二类斯特林数
- 记作 S ( n , k ) S(n,k) S(n,k) 或者 { n k } \begin{Bmatrix}n\\k\end{Bmatrix} {nk} 表示将 n n n 个两两不同的元素,划分为 k k k 个互不区分的非空子集的方案数。
- 易知 { n 0 } = [ n = 0 ] , { n k } = { n − 1 k − 1 } + k { n − 1 k } \begin{Bmatrix}n\\0\end{Bmatrix} = [n = 0], \begin{Bmatrix}n\\k\end{Bmatrix} = \begin{Bmatrix} n - 1\\k- 1\end{Bmatrix} + k\begin{Bmatrix}n - 1\\k\end{Bmatrix} {n0}=[n=0],{nk}={n−1k−1}+k{n−1k}。
- 结论 长度为 n n n 且最大数不超过 m m m 的单调不降正整数数列的各数乘积之和为 { n + m m } \begin{Bmatrix}n+m\\m\end{Bmatrix} {n+mm}。
证明 相当于将 n + m n+m n+m 个不同的球放入 m m m 个相同的盒子中,每个球至少有一个球。可将放入每个球的过程分为选择一个有球/无球的盒子和放入两步,则需要选择一个有球盒子的球恰好有 n n n 个,第 i i i 个选择有球盒子的球选择的方案数为当前有球的盒子数, 可等价为数列中的第 i i i 个数。
快速计算一整行的第二类斯特林数
- 设 G n , k G_{n,k} Gn,k 为将 n n n 个两两不同的元素,划分为 k k k 个两两不同(允许为空)的集合的方案数, F n , k F_{n,k} Fn,k 为将 n n n 个两两不同的元素,划分为 k k k 个两两不同的非空集合的方案数,由容斥原理得:
{ n k } = F n , k k ! = 1 k ! ∑ i = 0 k ( − 1 ) k − i ( k i ) G n , i = ∑ i = 0 k ( − 1 ) k − i ( k − i ) ! i n i ! \begin{Bmatrix}n\\k\end{Bmatrix} = \frac{F_{n,k}}{k!} = \frac{1}{k!}\sum\limits_{i = 0}^{k}(-1)^{k - i}\binom{k}{i}G_{n,i} = \sum\limits_{i = 0}^{k}\frac{(-1)^{k - i}}{(k - i)!} \frac{i^n}{i!} {nk}=k!Fn,k=k!1i=0∑k(−1)k−i(ik)Gn,i=i=0∑k(k−i)!(−1)k−ii!in
- 显然是卷积的形式。
快速计算一整列的第二类斯特林数
- 由于非空集合的限制,设指数型生成函数 H ( x ) = ∑ i ≥ 1 x i i ! H(x) = \sum \limits_{i\ge 1}\frac{x^i}{i!} H(x)=i≥1∑i!xi,则
{ i k } = i ! k ! [ x i ] H k ( x ) \begin{Bmatrix} i\\k\end{Bmatrix} = \frac{i!}{k!}[x^i]H^k(x) {ik}=k!i![xi]Hk(x)
- 通过多项式快速幂计算即可。
次幂的拆解
- 因为
G n , k = ∑ i = 0 k ( k i ) F n , i k n = ∑ i = 0 min { k , n } { n i } ( k i ) i ! G_{n,k} = \sum \limits_{i = 0}^{k} \binom{k}{i} F_{n,i} \\ k^n = \sum \limits_{i = 0}^{\min\{k,n\}} \begin{Bmatrix}n\\i\end{Bmatrix} \binom{k}{i} i! Gn,k=i=0∑k(ik)Fn,ikn=i=0∑min{k,n}{ni}(ik)i!
- 若 n n n 比较小,就能实现将 k n k^n kn 拆开后分项计算。
第一类斯特林数
-
记作 s ( n , k ) s(n,k) s(n,k) 或者 [ n k ] \begin{bmatrix}n\\k\end{bmatrix} [nk],表示将 n n n 个两两不同的元素,划分为 k k k 个互不区分的非空轮换的方案数。
-
易知 [ n 0 ] = [ n = 0 ] , [ n k ] = [ n − 1 k − 1 ] + ( n − 1 ) [ n − 1 k ] \begin{bmatrix}n\\0 \end{bmatrix} = [n = 0], \begin{bmatrix}n\\k\end{bmatrix} = \begin{bmatrix}n - 1\\k - 1\end{bmatrix} + (n - 1)\begin{bmatrix} n - 1 \\ k\end{bmatrix} [n0]=[n=0],[nk]=[n−1k−1]+(n−1)[n−1k]。
-
设生成函数 F n ( x ) = ∑ k = 0 n [ n k ] x k F_n(x) = \sum \limits_{k = 0}^{n} \begin{bmatrix}n\\k\end{bmatrix}x^k Fn(x)=k=0∑n[nk]xk,根据递推式不难写出
F n ( x ) = x F n − 1 ( x ) + ( n − 1 ) F n − 1 ( x ) = ( x + n − 1 ) F n − 1 ( x ) = ∏ i = 0 n − 1 ( x + i ) F_n(x)=xF_{n-1}(x)+(n-1)F_{n-1}(x)=(x+n-1)F_{n-1}(x)=\prod\limits_{i=0}^{n -1}(x+i) Fn(x)=xFn−1(x)+(n−1)Fn−1(x)=(x+n−1)Fn−1(x)=i=0∏n−1(x+i)
-
容易通过分治 NTT 求出。
上升幂、下降幂、普通幂的相互转化
- 记上升幂 x n ‾ = ∏ i = 0 n − 1 ( x + i ) x^{\overline{n}}=\prod\limits_{i = 0}^{n-1}(x+i) xn=i=0∏n−1(x+i),下降幂 x n ‾ = ∏ i = 0 n − 1 ( x − i ) = x ! ( x − n ) ! = A x k x^{\underline{n}} = \prod\limits_{i = 0}^{n-1}(x-i) = \frac{x!}{(x-n)!} = A_{x}^k xn=i=0∏n−1(x−i)=(x−n)!x!=Axk,容易根据定义得到:
( − x ) n ‾ = ∏ i = 0 n − 1 ( − x + i ) = ( − 1 ) n ∏ i = 0 n − 1 ( x − i ) = ( − 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 \limits_{i = 0}^{n - 1}(-x+i)=(-1)^n\prod\limits_{i = 0}^{n - 1}(x-i)=(-1)^nx^{\underline{n}}\\ (-x)^{\underline{n}} = \prod \limits_{i = 0}^{n - 1}(-x-i)=(-1)^n\prod\limits_{i = 0}^{n - 1}(x+i)=(-1)^nx^{\overline{n}} (−x)n=i=0∏n−1(−x+i)=(−1)ni=0∏n−1(x−i)=(−1)nxn(−x)n=i=0∏n−1(−x−i)=(−1)ni=0∏n−1(x+i)=(−1)nxn
- 关于两者与普通幂之间的转换有如下结论,证明过程以顺序编号(1)~(4)指代:
x n ‾ = ∑ k = 0 n [ n k ] x k (1) x^{\overline{n}} = \sum \limits_{k = 0}^{n}\begin{bmatrix} n\\k\\\end{bmatrix}x^k\tag{1}\\ xn=k=0∑n[nk]xk(1) x n = ∑ k = 0 n ( − 1 ) n − k { n k } x k ‾ (2) x^n = \sum \limits_{k=0}^{n}(-1)^{n-k}\begin{Bmatrix} n\\k\\\end{Bmatrix}x^{\overline{k}}\tag{2}\\ xn=k=0∑n(−1)n−k{nk}xk(2) x n = ∑ k = 0 n { n k } x k ‾ (3) x^n = \sum \limits_{k = 0}^{n}\begin{Bmatrix} n\\k\\\end{Bmatrix}x^{\underline{k}}\tag{3}\\ xn=k=0∑n{nk}xk(3) x n ‾ = ∑ k = 0 n ( − 1 ) n − k [ n k ] x k (4) x^{\underline{n}} = \sum \limits_{k=0}^{n}(-1)^{n-k}\begin{bmatrix} n\\k\\\end{bmatrix}x^{k}\tag{4}\\ xn=k=0∑n(−1)n−k[nk]xk(4)
证明 (1)已经在 第一类斯特林数 一节内容中用生成函数证明,考虑到:
( − x ) n ‾ = ( − 1 ) n x n ‾ = ∑ k = 0 n ( − 1 ) k [ n k ] x k (-x)^{\overline{n}} =(-1)^nx^{\underline{n}}= \sum \limits_{k = 0}^{n}(-1)^k\begin{bmatrix} n\\k\\\end{bmatrix}x^k (−x)n=(−1)nxn=k=0∑n(−1)k[nk]xk移项后即可得到(4)。
(3)容易根据 x k ‾ x^{\underline{k}} xk 和 x n x^n xn 的组合意义得到,利用类似的技巧,可以得到:
( − x ) n = ∑ k = 0 n { n k } ( − x ) k ‾ = ∑ k = 0 n ( − 1 ) k { n k } x k ‾ (-x)^n = \sum \limits_{k=0}^{n}\begin{Bmatrix} n\\k\\\end{Bmatrix}(-x)^{\underline{k}} = \sum \limits_{k=0}^{n}(-1)^k\begin{Bmatrix} n\\k\\\end{Bmatrix}x^{\overline{k}} (−x)n=k=0∑n{nk}(−x)k=k=0∑n(−1)k{nk}xk整理移项后即可得到(2),证毕。
贝尔数
- 设 B n B_n Bn 表示基为 n n n 的集合的划分数目,则 B n = ∑ i = 0 n { n i } B_n = \sum\limits_{i = 0}^{n}\begin{Bmatrix}n\\i\end{Bmatrix} Bn=i=0∑n{ni}。
- 考虑第 n n n 个元素归属的划分, B n B_n Bn 有递推公式:
B n = ∑ i = 0 n − 1 ( n − 1 i ) B i = ( n − 1 ) ! ∑ i = 0 n − 1 B i i ! 1 ( n − 1 − i ) ! B_n = \sum\limits_{i = 0}^{n - 1}\binom{n - 1}{i}B_i = (n - 1)!\sum\limits_{i = 0}^{n - 1}\frac{B_i}{i!} \frac{1}{(n - 1 - i)!} Bn=i=0∑n−1(in−1)Bi=(n−1)!i=0∑n−1i!Bi(n−1−i)!1
- 可以通过分治 NTT 快速求得 B i ( 1 ≤ i ≤ n ) B_i(1 \le i \le n) Bi(1≤i≤n)。
- 另外,沿用第二类斯特林数中 H ( x ) H(x) H(x) 的定义, exp H ( x ) = ∑ i ≥ 0 H i ( x ) i ! \text{exp}\ H(x) = \sum\limits_{i\ge 0}\frac{H^i(x)}{i!} exp H(x)=i≥0∑i!Hi(x) 即为贝尔数的生成函数,也可通过这一方式来计算。
卡特兰数
- 通项公式 h n = C 2 n n − C 2 n n + 1 = C 2 n n n + 1 = ( 2 n ) ! n ! ( n + 1 ) ! h_n = C_{2n}^{n} - C_{2n}^{n+1}=\frac{C^{n}_{2n}}{n+1}=\frac{(2n)!}{n!(n +1)!} hn=C2nn−C2nn+1=n+1C2nn=n!(n+1)!(2n)!
- 在平面直角坐标系上,每一步只能往上走或往右走,从 ( 0 , 0 ) (0,0) (0,0) 走到 ( n , n ) (n, n) (n,n) 并且两个端点外不接触直线 y = x y = x y=x 的路线数量为 2 h n − 1 2h_{n - 1} 2hn−1,不跨过直线 y = x y = x y=x 的路线数量为 h n h_n hn,证明过程即通项公式的证明。
- 递推公式 h 0 = h 1 = 1 h_0 = h_1 = 1 h0=h1=1, h n = ( 4 n − 2 ) h n − 1 n + 1 h_n = \frac{(4n - 2)h_{n - 1}}{n+1} hn=n+1(4n−2)hn−1, h n = ∑ i = 0 n − 1 h i h n − i − 1 h_n=\sum\limits_{i=0}^{n - 1}h_ih_{n-i-1} hn=i=0∑n−1hihn−i−1
- 入栈顺序为 1 , 2 , … , n 1,2,\dots,n 1,2,…,n,合法出栈顺序的方案数为 h n h_n hn。
- 考虑枚举最后一个出栈的元素为 k k k,则小于 k k k 的元素必定在 k k k 入栈之前出栈,大于 k k k 的元素必定在 k k k 出栈之前出栈,可证得该递推式。
- 相关问题
- n n n 对括号的合法匹配数为 h n h_n hn。
- n n n 个节点构成的不同二叉树的数量为 h n h_n hn。
- 圆上 2 n 2n 2n 个点,两两配对连线不相交的方案数为 h n h_n hn。
- n n n 条边的凸多边形三角剖分划分方案数 h n − 2 h_{n - 2} hn−2(枚举其中一条边对应的三角剖分)。
分拆数
-
令 f n f_n fn 表示将 n n n 进行分拆的方案数。
-
例如, 1 + 1 + 1 + 1 = 1 + 1 + 2 = 1 + 3 = 2 + 2 = 4 1 + 1 + 1 + 1 = 1 + 1 + 2 = 1 + 3 = 2 + 2 = 4 1+1+1+1=1+1+2=1+3=2+2=4 ,所以 f 4 = 5 f_4 = 5 f4=5 。
-
下面给出几种常见的计算 f i ( 1 ≤ i ≤ n ) f_i(1 \le i \le n) fi(1≤i≤n) 的方法。
根号分治
-
设 S = ⌊ n ⌋ S = \lfloor \sqrt{n}\rfloor S=⌊n ⌋。
-
对于 > S > S >S 的数,设 g i , j g_{i,j} gi,j 表示选了 i i i 个数总和为 i ( S + 1 ) + j i(S+1) + j i(S+1)+j 的方案数,转移有两种:
- 新加入一个数,初始值为 S + 1 S + 1 S+1: g i , j + = g i − 1 , j g_{i,j} += g_{i - 1, j} gi,j+=gi−1,j。
- 给之前选的所有数
+1
: g i , j + = g i , j − i g_{i,j} += g_{i,j - i} gi,j+=gi,j−i。
-
第一维只有 O ( n ) \mathcal O( \sqrt{n}) O(n ) 级别,时间复杂度 O ( n n ) \mathcal O(n \sqrt{n}) O(nn )。
-
求出 > S >S >S 的数的 DP \text{DP} DP 数组后,对于 ≤ S \le S ≤S 的数,直接完全背包即可,总的时间复杂度 O ( n n ) \mathcal O(n \sqrt{n}) O(nn )。
s = sqrt(n);
g[0] = 1;
for (int i = 1; i <= s; ++i)
for (int j = 0, jm = n - i * (s + 1); j <= jm; ++j)
{
if (j >= i)
add(g[j], g[j - i]);
add(f[i * (s + 1) + j], g[j]);
}
f[0] = 1;
for (int i = 1; i <= s; ++i)
for (int j = i; j <= n; ++j)
add(f[j], f[j - i]);
生成函数
- 令 f 0 = 1 f_0 = 1 f0=1,考虑 f i f_i fi 的生成函数:
F ( x ) = ∑ i = 0 ∞ f i x i = ∏ i = 1 ∞ 1 1 − x i = exp ( ∑ i = 1 ∞ ln 1 1 − x i ) \begin{aligned}F(x) &= \sum \limits_{i = 0}^{\infty}f_ix^i \\&= \prod \limits_{i = 1}^{\infty} \frac{1}{1 - x^i}\\&= \exp\left(\sum \limits_{i = 1}^{\infty} \ln \frac{1}{1-x^i}\right)\\\end{aligned} F(x)=i=0∑∞fixi=i=1∏∞1−xi1=exp(i=1∑∞ln1−xi1)
- 注意到:
( ln 1 1 − x i ) ′ = ( 1 − x i ) ( 1 1 − x i ) ′ ⇔ ln 1 1 − x i = ∫ ( 1 − x i ) ( 1 1 − x i ) ′ d x = ∑ j = 1 ∞ x i j − ∑ j = 2 ∞ j − 1 j x i j = ∑ j = 1 ∞ x i j j \begin{aligned}(\ln \frac{1}{1 - x^i})' = (1 - x^i)\left(\frac{1}{1 - x^i}\right)' \Leftrightarrow\ \ln \frac{1}{1 - x^i} =& \int (1 - x^i)\left(\frac{1}{1 - x^i}\right)' dx\\=& \sum \limits_{j = 1}^{\infty}x^{ij} - \sum \limits_{j = 2}^{\infty}\frac{j - 1}{j}x^{ij}\\=& \sum \limits_{j = 1}^{\infty}\frac{x^{ij}}{j}\\\end{aligned} (ln1−xi1)′=(1−xi)(1−xi1)′⇔ ln1−xi1===∫(1−xi)(1−xi1)′dxj=1∑∞xij−j=2∑∞jj−1xijj=1∑∞jxij
- 所以
F ( x ) = exp ( ∑ i = 1 ∞ ∑ j = 1 ∞ x i j j ) \begin{aligned}F(x) = \exp\left(\sum \limits_{i = 1}^{\infty}\sum \limits_{j = 1}^{\infty} \frac{x^{ij}}{j}\right)\\\end{aligned} F(x)=exp(i=1∑∞j=1∑∞jxij)
- 可以 O ( n ln n ) \mathcal O(n \ln n) O(nlnn) 预处理出内部系数,再 exp \exp exp 回去,总时间复杂度 O ( n log n ) \mathcal O(n \log n) O(nlogn)。
五边形数定理
- 即函数 Φ ( x ) \varPhi(x) Φ(x) 满足:
Φ ( x ) = ∏ i = 1 ∞ ( 1 − x i ) = ∑ k = 0 ∞ ( − 1 ) k x k ( 3 k − 1 ) 2 \begin{aligned}\varPhi(x) = \prod \limits_{i = 1}^{\infty} (1 - x^i) = \sum \limits_{k = 0}^{\infty}(-1)^kx^{\frac{k(3k - 1)}{2}}\end{aligned} Φ(x)=i=1∏∞(1−xi)=k=0∑∞(−1)kx2k(3k−1)
- 具体证明见 visit_world博客中的证明。
- 由于 Φ ( x ) F ( x ) = 1 \varPhi(x)F(x) = 1 Φ(x)F(x)=1,可以直接多项式求逆,时间复杂度 O ( n log n ) \mathcal O(n \log n) O(nlogn)。
- 注意到 Φ ( x ) ( m o d x n + 1 ) \varPhi(x)(\mod x^{n + 1}) Φ(x)(modxn+1) 中系数不为 0 0 0 的项只有 O ( n ) \mathcal O(\sqrt{n}) O(n ) 个,也可以暴力进行求逆,时间复杂度 O ( n n ) \mathcal O(n \sqrt{n}) O(nn )。
高阶前缀和
- 考虑一个序列 a 1 , a 2 , a 3 , … a_1, a_2, a_3, \dots a1,a2,a3,…,设 f ( i , j ) f(i,j) f(i,j) 表示序列 a a a 中求 j j j 次前缀和后 a i a_i ai 中包含多少个 a 1 a_1 a1,显然 ∀ i ≥ 1 , f ( i , 1 ) = f ( 1 , i ) = 1 \forall i \ge 1, f(i,1) = f(1,i) = 1 ∀i≥1,f(i,1)=f(1,i)=1,容易得到转移: f ( i , j ) = f ( i , j − 1 ) + f ( i − 1 , j ) f(i,j)=f(i,j-1)+f(i-1,j) f(i,j)=f(i,j−1)+f(i−1,j)
- 利用坐标变换 { x = i + j − 2 y = j − 1 \begin{cases}x = i + j - 2\\y = j - 1 \\\end{cases} {x=i+j−2y=j−1 得到 g ( x , y ) = f ( i , j ) g(x,y) = f(i,j) g(x,y)=f(i,j),容易得到转移: g ( x , y ) = g ( x − 1 , y − 1 ) + g ( x − 1 , y ) g(x,y) = g(x - 1, y - 1) + g(x - 1,y) g(x,y)=g(x−1,y−1)+g(x−1,y)
- 容易验证 g ( x , y ) = ( x y ) g(x,y) = \binom{x}{y} g(x,y)=(yx),即 ∀ i ≥ 1 , j ≥ 1 , f ( i , j ) = ( i + j − 2 j − 1 ) \forall i \ge 1,j\ge 1,f(i,j) = \binom{i + j - 2}{j - 1} ∀i≥1,j≥1,f(i,j)=(j−1i+j−2)。
高阶差分
与组合数的关系
- 定义 Δ p h ( n ) \Delta^{p}h(n) Δph(n) 表示序列 h h h 经过 p p p 次差分后第 n n n 项的值,即
Δ p + 1 h ( n − 1 ) = Δ p h ( n ) − Δ p h ( n − 1 ) Δ 0 h ( n ) = h ( n ) \Delta^{p + 1}h(n - 1) = \Delta^ph(n)-\Delta^ph(n-1) \\\Delta^0h(n) = h(n) Δp+1h(n−1)=Δph(n)−Δph(n−1)Δ0h(n)=h(n)
- 结论1 可通过归纳法证明,若 h ( n ) = ∑ i = 0 p a i n i h(n) = \sum \limits_{i = 0}^pa_in^i h(n)=i=0∑paini,则 Δ p + 1 h ( n ) \Delta^{p+1}h(n) Δp+1h(n) 恒为 0。
- 结论2 若 ∀ i ≠ p , Δ i h ( 0 ) = 0 \forall i\not = p,\Delta^ih(0)=0 ∀i=p,Δih(0)=0 且 Δ p h ( 0 ) = 1 \Delta^ph(0) = 1 Δph(0)=1, h ( n ) h(n) h(n) 为 n n n 的 p p p 次多项式,则 h ( n ) = ( n p ) h(n) = \binom{n}{p} h(n)=(pn)。
证明 容易得到 ∀ 0 ≤ i < p , h ( i ) = 0 \forall 0 \le i < p,h(i)=0 ∀0≤i<p,h(i)=0 且 h ( p ) = 1 h(p) = 1 h(p)=1,可设 h ( n ) = c ∏ i = 0 p − 1 ( n − i ) h(n) = c\prod\limits_{i=0}^{p - 1}(n-i) h(n)=ci=0∏p−1(n−i)代入 h ( p ) = 1 h(p) = 1 h(p)=1,解得 c = 1 p ! c = \frac{1}{p!} c=p!1,即 h ( n ) = ( n p ) h(n) = \binom{n}{p} h(n)=(pn)。
- 结论3 根据结论 1 并推广结论 2,已知 Δ i h ( 0 ) ( 0 ≤ i ≤ p ) \Delta^ih(0)(0\le i\le p) Δih(0)(0≤i≤p) 且 h ( n ) h(n) h(n) 为 n n n 的 p p p 次多项式,则: h ( n ) = ∑ i = 0 p ( n i ) Δ i h ( 0 ) h(n) = \sum \limits_{i=0}^{p}\binom{n}{i}\Delta^ih(0) h(n)=i=0∑p(in)Δih(0)该结论可用于快速求一些数列的通项。
区间加等差数列
- 首项的贡献很容易计算,考虑公差的贡献,将其差分两次后得到:
0 |
d d d |
2 d 2d 2d |
… \dots … |
n d nd nd |
0 |
0 |
0 |
0 |
d d d |
d d d |
… \dots … |
d d d |
− n d -nd −nd |
0 |
0 |
0 |
d d d |
0 |
… \dots … |
0 |
− ( n + 1 ) d -(n+1)d −(n+1)d |
n d nd nd |
0 |
- 每次操作打上标记后,最后求两次前缀和即可(注意不要把 n d nd nd 遗漏,其它高阶差分问题也要注意这样的边界问题)。
二维矩阵差分
- 设 Δ h ( i , j ) = h ( i , j ) − h ( i − 1 , j ) − h ( i , j − 1 ) + h ( i − 1 , j − 1 ) \Delta h(i,j) = h(i,j) - h(i - 1,j) - h(i,j - 1) + h(i - 1, j - 1) Δh(i,j)=h(i,j)−h(i−1,j)−h(i,j−1)+h(i−1,j−1)。
- 倘若我们需要给一个矩阵的某个子方矩阵打上下面这样的标记:
0 0 0 0 … 0 0 0 d d d … d 0 0 d 2 d 2 d … 2 d 0 0 d 2 d 3 d … 3 d 0 ⋮ ⋮ ⋮ ⋮ ⋱ ⋮ ⋮ 0 d 2 d 3 d … n d 0 0 0 0 0 … 0 0 \begin{matrix} 0 & 0 & 0 & 0 & \dots & 0 & 0\\ 0 & d & d & d & \dots & d & 0\\ 0 & d & 2d & 2d & \dots & 2d & 0\\ 0 & d & 2d & 3d & \dots & 3d & 0\\ \vdots & \vdots & \vdots & \vdots & \ddots & \vdots & \vdots \\ 0 & d & 2d & 3d & \dots & nd & 0\\ 0 & 0 & 0 & 0 & \dots & 0 & 0\\ \end{matrix} 0000⋮000ddd⋮d00d2d2d⋮2d00d2d3d⋮3d0…………⋱……0d2d3d⋮nd00000⋮00
- 做一次二维矩阵差分后,可得到:
0 0 0 0 … 0 0 0 d 0 0 … 0 − d 0 0 d 0 … 0 − d 0 0 0 d … 0 − d ⋮ ⋮ ⋮ ⋮ ⋱ ⋮ ⋮ 0 0 0 0 … d − d 0 − d − d − d … − d n d \begin{matrix} 0 & 0 & 0 & 0 & \dots & 0 & 0\\ 0 & d & 0 & 0 & \dots & 0 & -d\\ 0 & 0 & d & 0 & \dots & 0 & -d\\ 0 & 0 & 0 & d & \dots & 0 & -d\\ \vdots & \vdots & \vdots & \vdots & \ddots & \vdots & \vdots \\ 0 & 0 & 0 & 0 & \dots & d & -d\\ 0 & -d & -d & -d & \dots & -d & nd\\ \end{matrix} 0000⋮000d00⋮0−d00d0⋮0−d000d⋮0−d…………⋱……0000⋮d−d0−d−d−d⋮−dnd
- 通过对行、列、主对角线分别差分最后把标记合并即可。
- 类似地,倘若我们需要给一个矩阵的某个子方矩阵打上下面这样的标记:
0 0 0 0 … 0 0 0 d d d … d 0 0 d 3 d 3 d … 3 d 0 0 d 3 d 6 d … 6 d 0 ⋮ ⋮ ⋮ ⋮ ⋱ ⋮ ⋮ 0 d 3 d 6 d … n ( n + 1 ) 2 d 0 0 0 0 0 … 0 0 \begin{matrix} 0 & 0 & 0 & 0 & \dots & 0 & 0\\ 0 & d & d & d & \dots & d & 0\\ 0 & d & 3d & 3d & \dots & 3d & 0\\ 0 & d & 3d & 6d & \dots & 6d & 0\\ \vdots & \vdots & \vdots & \vdots & \ddots & \vdots & \vdots \\ 0 & d & 3d & 6d & \dots & \frac{n(n + 1)}{2}d & 0\\ 0 & 0 & 0 & 0 & \dots & 0 & 0\\ \end{matrix} 0000⋮000ddd⋮d00d3d3d⋮3d00d3d6d⋮6d0…………⋱……0d3d6d⋮2n(n+1)d00000⋮00
- 做一次二维矩阵差分后,可得到:
0 0 0 0 … 0 0 0 d 0 0 … 0 − d 0 0 2 d 0 … 0 − 2 d 0 0 0 3 d … 0 − 3 d ⋮ ⋮ ⋮ ⋮ ⋱ ⋮ ⋮ 0 0 0 0 … n d − n d 0 − d − 2 d − 3 d … − n d n ( n + 1 ) 2 d \begin{matrix} 0 & 0 & 0 & 0 & \dots & 0 & 0\\ 0 & d & 0 & 0 & \dots & 0 & -d\\ 0 & 0 & 2d & 0 & \dots & 0 & -2d\\ 0 & 0 & 0 & 3d & \dots & 0 & -3d\\ \vdots & \vdots & \vdots & \vdots & \ddots & \vdots & \vdots \\ 0 & 0 & 0 & 0 & \dots & nd & -nd\\ 0 & -d & -2d & -3d & \dots & -nd & \frac{n(n + 1)}{2}d\\ \end{matrix} 0000⋮000d00⋮0−d002d0⋮0−2d0003d⋮0−3d…………⋱……0000⋮nd−nd0−d−2d−3d⋮−nd2n(n+1)d
- 通过对行、列、主对角线分别做区间加等差数列的差分,最后把标记合并即可。