Algorithm Review 7 组合数学

组合数学

  • 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,j1+fij,j
  • 若要求每个盒子中至少放一个,则答案为 f n − m , m f_{n - m,m} fnm,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=0m(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=0m(kk+i)=(k+1k+1)+(kk+1)+i=2m(kk+i)=(k+1k+2)+(kk+2)+i=3m(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=Fn1+Fn2), 有:
    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=0n1(kn1k)

    证明 易知 F 0 = 0 , F 1 = 1 F_0 = 0,F_1 = 1 F0=0,F1=1,对于 n ≥ 2 n\ge 2 n2,考虑归纳证明
    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=Fn1+Fn2=(0n2)+k=1n2(kn2k)+k=1n2(k1n2k)=(0n1)+k=1n2(kn1k)+(n10)=k=0n1(kn1k)

  • 范德蒙德卷积 ∑ 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=0k(in)(kim)=(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=0min{n,m}(in)(im)=(nn+m)=(mn+m)(利用 ( n i ) = ( n n − i ) \binom{n}{i} = \binom{n}{n - i} (in)=(nin))。
    • 推论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=0n(in)(i+km)=i=0n(nin)(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,aiaj=bkbl
  • 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 2n,m106,0ai,bi107

题解

  • 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 的反例如下图,实际上任取一个五元环即可。

    Algorithm Review 7 组合数学_第1张图片

  • 可以证明 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)>n1,显然我们可以将 K n − 1 K_{n - 1} Kn1 的所有边都染成蓝色而符合条件。
    • 证明 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(n1,m)+r(n,m1)

证明 p = r ( n − 1 , m ) + r ( n , m − 1 ) p = r(n - 1, m) + r(n,m - 1) p=r(n1,m)+r(n,m1),任取 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=p1

由鸽巢原理,一定存在以下两个条件之一成立:

  1. ∣ R x ∣ ≥ r ( n − 1 , m ) |R_x| \ge r(n - 1,m) Rxr(n1,m)

  2. ∣ B x ∣ ≥ r ( n , m − 1 ) |B_x| \ge r(n, m - 1) Bxr(n,m1)

对于条件 1,在 R x R_x Rx 中任取 r ( n − 1 , m ) r(n - 1, m) r(n1,m) 个点,由 r ( n − 1 , m ) r(n - 1, m) r(n1,m) 的定义至少存在一个边全为红色的 K n − 1 K_{n - 1} Kn1 或边全为蓝色的 K m K_{m} Km。若存在一个边全为蓝色的 K m K_m Km,证明已经完成;若存在一个边全为红色的 K n − 1 K_{n - 1} Kn1,将 x x x 加入即可得到边全为红色的 K n K_n Kn

对于条件2,同理可证。

  • 推论 r ( n − 1 , m ) r(n - 1,m) r(n1,m) r ( n , m − 1 ) r(n,m - 1) r(n,m1) 均为偶数,则 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(n1,m)+r(n,m1)1

证明 沿用 结论 中证明的定义,此时 ∣ R x ∣ + ∣ B x ∣ = p − 2 |R_x| + |B_x| = p - 2 Rx+Bx=p2

由鸽巢定理,一定存在以下三个条件之一成立:

  1. ∣ R x ∣ ≥ r ( n − 1 , m ) |R_x| \ge r(n - 1,m) Rxr(n1,m)

  2. ∣ B x ∣ ≥ r ( n , m − 1 ) |B_x| \ge r(n, m - 1) Bxr(n,m1)

  3. ∣ R x ∣ = r ( n − 1 , m ) − 1 |R_x| = r(n - 1,m) - 1 Rx=r(n1,m)1 ∣ B x ∣ = r ( n , m − 1 ) − 1 |B_x| = r(n, m - 1) - 1 Bx=r(n,m1)1

前两个条件已经被证明,该推论可能不成立当且仅当对于所有点都满足条件 3,然而若所有点都满足条件 3 时由握手定理,图中的红边总数为 ( r ( n − 1 , m ) − 1 ) ( p − 1 ) 2 \frac{(r(n - 1,m) - 1)(p - 1)}{2} 2(r(n1,m)1)(p1) ,由奇偶性该式一定不为整数,故至少存在一个点不满足条件 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)14+61=9,以下是证明 r ( 3 , 4 ) > 8 r(3,4) > 8 r(3,4)>8 的例子:
        Algorithm Review 7 组合数学_第2张图片
      • 记中间四条红边为特殊边。对于边全为红色的 K 3 K_3 K3,容易验证不含或只含一条特殊边的红环边数均大于3,而若含两条及以上特殊边,因为特殊边间没有公共点,肯定不会形成三元环。对于边全为蓝色的 K 4 K_4 K4
        我们需要保证选到的点中不存在两点是一条特殊边的两个端点,但此时一定会存在两点在除特殊边外的红八元环上相邻。
    • 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 012
        • 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 jiA
      • 首先肯定不会边全为红色的 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。
      • 对剩下选取的结点进行分类讨论,不难排除所有可能的方案。
  • 结论2 r ( n , m ) > ( n − 1 ) ( m − 1 ) r(n,m) > (n - 1)(m - 1) r(n,m)>(n1)(m1)

证明 构造一个 n − 1 n - 1 n1 m − 1 m - 1 m1 列的点阵,同行的点之间连红边,否则连蓝边,显然图中不存在边全为红色的 K n − 1 K_{n - 1} Kn1 和边全为蓝色的 K m − 1 K_{m - 1} Km1

  • 将 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,,xk2,r(xk1,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)(k3)

证明 X = r ( 3 , … , 3 ) ( k 个 3 ) X = r(3,\dots,3)(k个3) X=r(3,,3)(k3),将 { 1 , 2 , … , X − 1 } \{1,2,\dots,X-1\} {1,2,,X1} 划分成 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 ijRl,则将 ( 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| ji+kj=ki,与 Sum-Free 划分 的定义矛盾。

二项式反演

  • 结论 给定 k ∈ N k \in \mathbb N kN,则存在以下关系式
    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=kn(ki)fifk=i=kn(1)ik(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=kn(1)ik(ki)gi=i=kn(1)ik(ki)j=in(ij)fj=j=knfji=kj(1)ik(ki)(ij)=j=knfji=kj(1)ik(kj)(ikjk)=j=kn(kj)fji=0jk(1)i(ijk)=j=kn(kj)fj(11)jk=j=kn(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}={n1k1}+k{n1k}
  • 结论 长度为 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=0k(1)ki(ik)Gn,i=i=0k(ki)!(1)kii!in
  • 显然是卷积的形式。

快速计算一整列的第二类斯特林数

  • 由于非空集合的限制,设指数型生成函数 H ( x ) = ∑ i ≥ 1 x i i ! H(x) = \sum \limits_{i\ge 1}\frac{x^i}{i!} H(x)=i1i!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=0k(ik)Fn,ikn=i=0min{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]=[n1k1]+(n1)[n1k]

  • 设生成函数 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=0n[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)=xFn1(x)+(n1)Fn1(x)=(x+n1)Fn1(x)=i=0n1(x+i)

  • 容易通过分治 NTT 求出。

上升幂、下降幂、普通幂的相互转化

  • 记上升幂 x n ‾ = ∏ i = 0 n − 1 ( x + i ) x^{\overline{n}}=\prod\limits_{i = 0}^{n-1}(x+i) xn=i=0n1(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=0n1(xi)=(xn)!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=0n1(x+i)=(1)ni=0n1(xi)=(1)nxn(x)n=i=0n1(xi)=(1)ni=0n1(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=0n[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=0n(1)nk{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=0n{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=0n(1)nk[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=0n(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=0n{nk}(x)k=k=0n(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=0n{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=0n1(in1)Bi=(n1)!i=0n1i!Bi(n1i)!1
  • 可以通过分治 NTT 快速求得 B i ( 1 ≤ i ≤ n ) B_i(1 \le i \le n) Bi(1in)
  • 另外,沿用第二类斯特林数中 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)=i0i!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=C2nnC2nn+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} 2hn1,不跨过直线 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(4n2)hn1 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=0n1hihni1
    • 入栈顺序为 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} hn2(枚举其中一条边对应的三角剖分)。

分拆数

  • 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(1in) 的方法。

根号分治

  • 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 的方案数,转移有两种:

    1. 新加入一个数,初始值为 S + 1 S + 1 S+1 g i , j + = g i − 1 , j g_{i,j} += g_{i - 1, j} gi,j+=gi1,j
    2. 给之前选的所有数 +1 g i , j + = g i , j − i g_{i,j} += g_{i,j - i} gi,j+=gi,ji
  • 第一维只有 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=0fixi=i=11xi1=exp(i=1ln1xi1)
  • 注意到:
    ( 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} (ln1xi1)=(1xi)(1xi1) ln1xi1===(1xi)(1xi1)dxj=1xijj=2jj1xijj=1jxij
  • 所以
    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=1j=1jxij)
  • 可以 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(1xi)=k=0(1)kx2k(3k1)
  • 具体证明见 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 i1,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,j1)+f(i1,j)
  • 利用坐标变换 { x = i + j − 2 y = j − 1 \begin{cases}x = i + j - 2\\y = j - 1 \\\end{cases} {x=i+j2y=j1 得到 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(x1,y1)+g(x1,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} i1,j1,f(i,j)=(j1i+j2)

高阶差分

与组合数的关系

  • 定义 Δ 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(n1)=Δph(n)Δph(n1)Δ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=0paini,则 Δ 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 ∀0i<ph(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=0p1(ni)代入 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)(0ip) 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=0p(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(i1,j)h(i,j1)+h(i1,j1)
  • 倘若我们需要给一个矩阵的某个子方矩阵打上下面这样的标记:
    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} 0000000dddd00d2d2d2d00d2d3d3d00d2d3dnd0000000
  • 做一次二维矩阵差分后,可得到:
    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} 0000000d000d00d00d000d0d0000dd0ddddnd
  • 通过对行、列、主对角线分别差分最后把标记合并即可。
  • 类似地,倘若我们需要给一个矩阵的某个子方矩阵打上下面这样的标记:
    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} 0000000dddd00d3d3d3d00d3d6d6d00d3d6d2n(n+1)d0000000
  • 做一次二维矩阵差分后,可得到:
    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} 0000000d000d002d002d0003d03d0000ndnd0d2d3dnd2n(n+1)d
  • 通过对行、列、主对角线分别做区间加等差数列的差分,最后把标记合并即可。

你可能感兴趣的:(学习笔记,算法)