组合数学
-
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} \dbinom{k + i}{k} = \dbinom{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}\dbinom{n}{i}\dbinom{m}{k - i} = \dbinom{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\}}\dbinom{n}{i}\dbinom{m}{i} = \dbinom{n+m}{n} = \dbinom{n + m}{m} i=0∑min{n,m}(in)(im)=(nn+m)=(mn+m)(利用 ( n i ) = ( n n − i ) \dbinom{n}{i} = \dbinom{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}\dbinom{n}{i}\dbinom{m}{i+k} = \sum \limits_{i = 0}^{n}\dbinom{n}{n - i}\dbinom{m}{i+k} = \dbinom{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 种,暴力枚举即可。
容斥原理
- 若是带着容斥系数 DP,可利用组合数递推关系进行转移。
一般化形式
- 对于两个集合函数 f ( S ) , g ( S ) f(S),g(S) f(S),g(S),以下两个等式可进行等价变换:
f ( S ) = ∑ T ⊆ S g ( T ) ⇔ g ( S ) = ∑ T ⊆ S ( − 1 ) ∣ S ∣ − ∣ T ∣ f ( T ) f(S) = \sum \limits_{T \subseteq S}g(T) \Leftrightarrow g(S) = \sum \limits_{T\subseteq S}(-1)^{|S|-|T|}f(T) f(S)=T⊆S∑g(T)⇔g(S)=T⊆S∑(−1)∣S∣−∣T∣f(T)
证明 以下证明左边推导到右边,右边到左边证明过程基本一致。
∑ T ⊆ S ( − 1 ) ∣ S ∣ − ∣ T ∣ f ( T ) = ∑ T ⊆ S ∑ Q ⊆ T ( − 1 ) ∣ S ∣ − ∣ T ∣ g ( Q ) = ∑ Q ⊆ S g ( Q ) ∑ Q ⊆ T ⊆ S ( − 1 ) ∣ S ∣ − ∣ T ∣ = ∑ Q ⊆ S g ( Q ) ∑ Q ⊆ T ⊆ S , T ′ = T − Q ⊆ S − Q ( − 1 ) ∣ S − Q ∣ − ∣ T ′ ∣ \begin{aligned} \sum\limits_{T\subseteq S}(-1)^{|S|-|T|}f(T) &= \sum \limits_{T \subseteq S} \sum\limits_{Q\subseteq T}(-1)^{|S|-|T|}g(Q) \\ &= \sum \limits_{Q\subseteq S}g(Q)\sum\limits_{Q\subseteq T\subseteq S}(-1)^{|S|-|T|}\\ &= \sum \limits_{Q\subseteq S}g(Q)\sum\limits_{Q\subseteq T\subseteq S,T'=T-Q\subseteq S-Q}(-1)^{|S - Q| - |T'|} \end{aligned} T⊆S∑(−1)∣S∣−∣T∣f(T)=T⊆S∑Q⊆T∑(−1)∣S∣−∣T∣g(Q)=Q⊆S∑g(Q)Q⊆T⊆S∑(−1)∣S∣−∣T∣=Q⊆S∑g(Q)Q⊆T⊆S,T′=T−Q⊆S−Q∑(−1)∣S−Q∣−∣T′∣
另设
F ( S ) = ∑ T ⊆ S ( − 1 ) ∣ S ∣ − ∣ T ∣ = ∑ i = 0 ∣ S ∣ ( − 1 ) ∣ S ∣ − i ( ∣ S ∣ i ) = ( 1 − 1 ) ∣ S ∣ = [ S = ∅ ] \begin{aligned} F(S) &= \sum \limits_{T\subseteq S}(-1)^{|S| - |T|}\\ &= \sum\limits_{i = 0}^{|S|}(-1)^{|S| - i}\binom{|S|}{i} \\&= (1-1)^{|S|}=[S = \varnothing] \end{aligned} F(S)=T⊆S∑(−1)∣S∣−∣T∣=i=0∑∣S∣(−1)∣S∣−i(i∣S∣)=(1−1)∣S∣=[S=∅]
代入得:
g ( S ) = ∑ Q ⊆ S g ( Q ) F ( S − Q ) = ∑ Q ⊆ S g ( Q ) [ S = Q ] = g ( S ) \begin{aligned} g(S) &= \sum\limits_{Q \subseteq S}g(Q)F(S - Q) \\ &= \sum\limits_{Q \subseteq S}g(Q)[S = Q] = g(S)\\ \end{aligned} g(S)=Q⊆S∑g(Q)F(S−Q)=Q⊆S∑g(Q)[S=Q]=g(S)
- 上述证明过程会得到以下等式,也可以作为一种变换技巧:
f ( S ) = ∑ T ⊆ S ∑ Q ⊆ T ( − 1 ) ∣ T ∣ − ∣ Q ∣ f ( Q ) = ∑ T ⊆ S ( − 1 ) ∣ S ∣ − ∣ T ∣ ∑ Q ⊆ T f ( Q ) f(S) = \sum \limits_{T \subseteq S}\sum\limits_{Q\subseteq T}(-1)^{|T| - |Q|}f(Q) = \sum \limits_{T \subseteq S}(-1)^{|S| - |T|}\sum \limits_{Q\subseteq T}f(Q) f(S)=T⊆S∑Q⊆T∑(−1)∣T∣−∣Q∣f(Q)=T⊆S∑(−1)∣S∣−∣T∣Q⊆T∑f(Q)
- 取 f ′ ( S ) = f ( U − S ) , g ′ ( S ) = g ( U − S ) f'(S) = f(U - S), g'(S) = g(U - S) f′(S)=f(U−S),g′(S)=g(U−S),可有以下推论:
f ′ ( S ) = ∑ S ⊆ T g ′ ( T ) ⇔ g ′ ( S ) = ∑ S ⊆ T ( − 1 ) ∣ T ∣ − ∣ S ∣ f ′ ( T ) f'(S) = \sum \limits_{S \subseteq T}g'(T) \Leftrightarrow g'(S) = \sum \limits_{S\subseteq T}(-1)^{|T|-|S|}f'(T) f′(S)=S⊆T∑g′(T)⇔g′(S)=S⊆T∑(−1)∣T∣−∣S∣f′(T)
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。
-
部分 Ramsey 数的证明:
-
r
(
3
,
4
)
=
9
r(3,4) = 9
r(3,4)=9
- 由 推论 可知
r
(
3
,
4
)
≤
r
(
2
,
4
)
+
r
(
3
,
3
)
−
1
≤
4
+
6
−
1
=
9
r(3,4) \le r(2,4) + r(3,3) - 1 \le 4 + 6 - 1 = 9
r(3,4)≤r(2,4)+r(3,3)−1≤4+6−1=9,以下是证明
r
(
3
,
4
)
>
8
r(3,4) > 8
r(3,4)>8 的例子:
- 记中间四条红边为特殊边。对于边全为红色的
K
3
K_3
K3,容易验证不含或只含一条特殊边的红环边数均大于3,而若含两条及以上特殊边,因为特殊边间没有公共点,肯定不会形成三元环。对于边全为蓝色的
K
4
K_4
K4,
我们需要保证选到的点中不存在两点是一条特殊边的两个端点,但此时一定会存在两点在除特殊边外的红八元环上相邻。
- 由 推论 可知
r
(
3
,
4
)
≤
r
(
2
,
4
)
+
r
(
3
,
3
)
−
1
≤
4
+
6
−
1
=
9
r(3,4) \le r(2,4) + r(3,3) - 1 \le 4 + 6 - 1 = 9
r(3,4)≤r(2,4)+r(3,3)−1≤4+6−1=9,以下是证明
r
(
3
,
4
)
>
8
r(3,4) > 8
r(3,4)>8 的例子:
-
r
(
3
,
5
)
=
14
r(3,5)=14
r(3,5)=14
- 由 推论 可知
r
(
3
,
5
)
≤
r
(
2
,
5
)
+
r
(
3
,
4
)
=
5
+
9
=
14
r(3,5) \le r(2,5) + r(3,4) = 5 + 9 = 14
r(3,5)≤r(2,5)+r(3,4)=5+9=14,下面是证明
r
(
3
,
5
)
>
13
r(3,5)>13
r(3,5)>13 的例子:
- 构造 13 个结点,标号 0 ∼ 12 0\sim 12 0∼12。
- 设 A = { 1 , 5 , 8 , 12 } A = \{1,5,8,12\} A={1,5,8,12}, ( i , j ) (i,j) (i,j) 为红色当且仅当 j − i ∈ A j - i \in A j−i∈A。
- 首先肯定不会边全为红色的 K 3 K_3 K3,因为集合 A A A 中任意两个元素之和均不属于 A A A。
- 注意到该构造的定义实际上是对称的,将一个 13 元环所有距离属于集合 A A A 的点对相连,故若存在至少一个边全为蓝色的 K 5 K_5 K5,一定存在一个边全为蓝色的 K 5 K_5 K5 包含结点 0。
- 对剩下选取的结点进行分类讨论,不难排除所有可能的方案。
- 由 推论 可知
r
(
3
,
5
)
≤
r
(
2
,
5
)
+
r
(
3
,
4
)
=
5
+
9
=
14
r(3,5) \le r(2,5) + r(3,4) = 5 + 9 = 14
r(3,5)≤r(2,5)+r(3,4)=5+9=14,下面是证明
r
(
3
,
5
)
>
13
r(3,5)>13
r(3,5)>13 的例子:
-
r
(
3
,
4
)
=
9
r(3,4) = 9
r(3,4)=9
-
结论2 r ( n , m ) > ( n − 1 ) ( m − 1 ) r(n,m) > (n - 1)(m - 1) r(n,m)>(n−1)(m−1)
证明 构造一个 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 i<j<k i<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 拆开后分项计算。
典例
题目大意
- 给定一个 DAG,点数为 n n n,边数为 m m m,设长度为 l l l 的路径的权值为 l k l^k lk,求 DAG 中所有路径的权值和,对 998244353 取模, n , m ≤ 2 × 1 0 5 n,m \le 2\times 10^5 n,m≤2×105, 0 ≤ k ≤ 500 0 \le k \le 500 0≤k≤500。
解法
- 设以 u u u 为终点的路径集合为 P u P_u Pu,另 f u , i = ∑ p ∈ P u ( ∣ p ∣ i ) f_{u,i} = \sum \limits_{p \in P_u}\dbinom{|p|}{i} fu,i=p∈Pu∑(i∣p∣)。
- 初始时
f
u
,
i
=
(
0
i
)
f_{u,i} = \dbinom{0}{i}
fu,i=(i0),根据组合数递推公式,对于有向边
u
→
v
u\to v
u→v,有转移
f v , i ← f u , i − 1 + f u , i f_{v,i} \leftarrow f_{u,i - 1} + f_{u,i} fv,i←fu,i−1+fu,i - 最后答案为 ∑ u = 1 n ∑ i = 0 k { k i } i ! f u , i \sum \limits_{u = 1}^{n}\sum \limits_{i = 0}^{k}\begin{Bmatrix}k\\i\end{Bmatrix}i!f_{u,i} u=1∑ni=0∑k{ki}i!fu,i,时间复杂度 O ( n k ) \mathcal O(nk) O(nk)。
第一类斯特林数
-
记作 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
n
x^{\underline{n}} = \prod\limits_{i = 0}^{n-1}(x-i) = \frac{x!}{(x-n)!} = A_{x}^n
xn=i=0∏n−1(x−i)=(x−n)!x!=Axn,容易根据定义得到:
( − 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 进行分拆的方案数,有上界 f n ≤ e 20 3 n f_n \le e^{\sqrt{\frac{20}{3}n}} fn≤e320n。
-
例如, 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 = − ln ( 1 − x i ) = ∑ j = 1 ∞ x i j j \ln \dfrac{1}{1 - x^i} = -\ln (1 - x^i) = \sum \limits_{j = 1}^{\infty} \frac{x^{ij}}{j} ln1−xi1=−ln(1−xi)=j=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 容易证明差分可使多项式降次,因此可对 p p p 归纳,若 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 | a 1 a_1 a1 | a 1 + d a_1+d a1+d | a 1 + 2 d a_1+2d a1+2d | … \dots … | a 1 + ( n − 1 ) d a_1 + (n -1)d a1+(n−1)d | 0 | 0 | 0 |
---|---|---|---|---|---|---|---|---|
0 | a 1 a_1 a1 | d d d | d d d | … \dots … | d d d | − a 1 − ( n − 1 ) d -a_1-(n-1)d −a1−(n−1)d | 0 | 0 |
0 | a 1 a_1 a1 | d − a 1 d - a_1 d−a1 | 0 | … \dots … | 0 | − a 1 − n d -a_1-nd −a1−nd | a 1 + ( n − 1 ) d a_1+(n-1)d a1+(n−1)d | 0 |
- 每次操作打上标记后,最后求两次前缀和即可(注意不要把 a 1 + ( n − 1 ) d a_1+(n-1)d a1+(n−1)d 遗漏,其它高阶差分问题也要注意这样的边界问题)。
二维矩阵差分
- 设 Δ 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 - 通过对行、列、主对角线分别做区间加等差数列的差分,最后把标记合并即可。