组合计数基础

组合计数基础知识点简要整理

排列数

定义

(P_n^m)(n) 个不同元素选出 (m) 个排成一列,可以得到不同的排列的数量:

[P_n^m = dfrac{n!}{(n-m)!} = prodlimits_{i=n-m+1}^n i ]

组合数

定义

(C_n^m) 表示从 (n) 个不同元素选出 (m) 个,组成不同的集合的数量(也可记作 ({nchoose m})):

[C_n^m = dfrac{n!}{m!(n-m)!} = dfrac{prod_{i=n-m+1}^n i}{prod_{i=1}^m i} ]

性质

  • (C_{n+m}^n = C_{n+m}^m)
  • (C_n^m = C_{n-1}^m+C_{n-1}^{m-1})
  • (sum_{i=0}^n C_n^i = 2^n)
  • (C_n^k = C_n^{k-1} imes frac{n-k+1}{n})

求法

  1. 使用性质 (C_n^m = C_{n-1}^m+C_{n-1}^{m-1}) 递推,计算出 (n) 范围以内的所有组合数。复杂度 (O(n^2))
  2. 递推出 (0 sim n) 的阶乘及其逆元,那么 (C_n^m = n! imes (m!)^{-1} imes [(n-m)!]^{-1})。复杂度 (O(n))
  3. 使用 (C_n^k = C_n^{k-1} imes frac{n-k+1}{n}) 递推出 (C_n^0 sim C_n^n) 的值。复杂度 (O(n))
  4. Lucas 定理。见下。

经典问题

多重集排列数

(n_1)(a_1)(n_2)(a_2),……,(n_k)(a_k) 组成的多重集可得的本质不同的排列数为:

[dfrac{(sum_{i=1}^k n_i)!}{prod_{i=1}^k (n_i!)} ]

多重集组合数

(n_1)(a_1)(n_2)(a_2),……,(n_k)(a_k) 组成的多重集选出 (R(le minlimits_{1le ile n} n_i)) 个元素,得到的本质不同的多重集数为:

[{{k-1}choose{k+R-1}} ]

二项式定理

((a+b)^n) 展开可得:

[(a+b)^n = sumlimits_{k=0}^n C_n^k a^k b^{n-k} ]

Lucas 定理

(p) 为质数,有:

[{nchoose m} equiv {{nmod p}choose {mmod p}} imes {{leftlfloor{n/p} ight floor} choose {leftlfloor{m/p} ight floor}} pmod p ]

(p) 不太大时,可以在 (O(p log_p n)) 的时间 求出组合数。

Catalan 数

定义

定义第 (n) 个 catalan 数为 (h(n)),定义式:

[h(n) = dfrac{C_{2n}^n}{n+1} ]

性质

  • 递推式 1:

    [h(n) = egin{cases} 1 & nle 1 \ sumlimits_{i=0}^{n-1} h(i) imes h(n-i - 1) & ext{otherwise.} end{cases} ]

  • 递推式 2:(h(n) = frac{4n-2}{n+1} imes h(n-1))

  • (h(n) = C_{2n}^n - C_{2n}^{n+1})

经典问题

  • 出栈次序问题
  • 三角网格路径记数
  • 二叉树计数

容斥原理

定义

集合 (S_1, S_2, cdots ,S_n) 的并集为:

[left|{Largeoperatorname{cup}limits_{i=1}^n} S_i ight| = sumlimits_{1le ile n} |S_i| - sumlimits_{1le ile jle n} |S_icap S_j| + sumlimits_{1le ile jle kle n} |S_icap S_jcap S_k| - cdots + (-1)^{n+1}|operatorname{cap}limits_{i=1}^n S_i| ]

经典问题

多重集组合数(拓展)

现在讨论上述该问题 (R) 无限制的问题。

不考虑 (n_i) 的限制,那么等价于从集合 ({inftycdot a_1, inftycdot a_2, cdots inftycdot a_k}) 中抽取 (R) 个的方案数,答案为 ({k+R-1choose k-1})

若设 (f_i) 为限定 (n_i+1) 个元素选 (a_i),剩下个元素任意选的方案数。那么方案数为 ({k+R-n_i-2choose k-1})

(f_{i, j}) 为限定 (n_i +1, n_j+1)(a_i, a_j) 选中,剩下任意选的方案数。那么即为 ({k+R-n_i-n_j-3 choose k-1})

根据容斥原理,并用总方案数减去非法方案数,有:

[{k+R-1 choose k-1} - sumlimits_{1le ile k} {k+R-n_i-2 choose k-1} + sumlimits_{1le ile jle k} {k+R-n_i-n_j-3choose k-1} - cdots +(-1)^k {k+R-sum_{i=1}^k n_i-(k+1) choose k-1} ]

二项式反演

[g(i) = sumlimits_{j=1}^i {ichoose j} f(j) quad Leftrightarrow quad f(i) = sumlimits_{j=1}^i (-1)^{i-j} {ichoose j} g(j) ]

证明:

将第一个式子代入第二个中:

[f(i)=sumlimits_{j=1}^i (-1)^{i-j} {ichoose j} sumlimits_{k=1}^j {jchoose k} f(k) ]

(a(i))(f(i)) 的系数。那么:

[a(k) = sumlimits_{j=k}^i (-1)^{i-j} {ichoose j}{jchoose k} \ = sumlimits_{j=k}^i (-1)^{i-j} dfrac{i! j!} {j!(i-j)!k!(j-k)!}\ = sumlimits_{j=k}^i (-1)^{i-j} dfrac{i!} {(i-j)!k!(j-k)!}\ = sumlimits_{j=k}^i (-1)^{i-j} dfrac{(i-k)!} {(i-j)!(j-k)!} imes dfrac{i!}{k!(i-k)!}\ = sumlimits_{j=k}^i (-1)^{i-j} {i-kchoose j-k}{ichoose k} ]

对于 (sum_{j=k}^i (-1)^{i-j} {i-kchoose j-k}) 其实可以理解为第 (i-k) 行的组合数错位相减的结果。如果 (i-k=0) 那么这个式子就是 (1),但否则由于 ({nchoose m} - {nchoose n-m} = 0),所以两两抵消后结果为 (0)。所以:

[a(k) = [i=k] imes {ichoose k} = [i=k]\ f(i) = sumlimits_{k=1}^i a(k)f(k) = f(i) ]

于是该式得证。

第一类斯特林数

定义

(egin{bmatrix} n \ k end{bmatrix})(n) 个不同元素分成 (k) 个非空环排列的方案数。

递推式

考虑此时新插入第 (n) 个元素:

  • 单独构成一个环:(egin{bmatrix} n-1 \ k-1 end{bmatrix})
  • 插入已有的 (k) 个环中。发现本质不同的位置有 (n-1) 个,那么方案数:((n-1)egin{bmatrix} n-1 \ k end{bmatrix})
  • 于是:

[egin{bmatrix}n \ kend{bmatrix} = egin{bmatrix}n-1\ k-1end{bmatrix} + (n-1)egin{bmatrix}n-1\ kend{bmatrix} ]

生成函数

设第 (n) 行的第一类斯特林数的生成函数为 (f(n) = sum_{i=0}^n egin{bmatrix} n \ i end{bmatrix} x^i)

根据递推式,有:(f(n+1) = f(n) imes (n+x))

于是:(f(n) = prodlimits_{i=0}^{n-1} (x+i) = x^{overline{n}})

性质

根据生成函数,有:

[x^{overline{n}} = sum_{i=0}^{n} egin{bmatrix} n\i end{bmatrix} x^i ]

下降幂形式((prod_{i-0}^{n-1}(x+i) o prod_{i-0}^{n-1}(x-i))):

[x^{underline{n}} = sumlimits_{i=0}^n (-1)^{n-i}egin{bmatrix} n\i end{bmatrix} x^i ]

第二类斯特林数

定义

(egin{Bmatrix} n\k end{Bmatrix}) 表示把 (n) 个不同元素分成 (k) 个非空集合的方案数。

两种方案不同当且仅当存在一个集合仅在其中一种方案中出现。

递推式

考虑此时新插入第 (n) 个元素:

  • 单独组成一个集合:(egin{Bmatrix} n-1\k-1 end{Bmatrix})
  • 插入原有的 (k) 个集合之一:(kegin{Bmatrix} n-1\k end{Bmatrix})
  • 于是:

[egin{Bmatrix} n\k end{Bmatrix} = egin{Bmatrix} n-1\k-1 end{Bmatrix} + kegin{Bmatrix} n-1\k end{Bmatrix} ]

通项公式

我们在原定义上的非空集合加上标号,那么方案数为 (k! imesegin{Bmatrix} n\k end{Bmatrix})

在上述定义上改为可空集,那么方案数 (k^n)。但是可以写成另一种写法——枚举所有集合中非空的个数:

[k^n = sum_{i=0}^k {k choose i} egin{Bmatrix} n\i end{Bmatrix} imes i! ]

二项式反演后:

[egin{Bmatrix} n\k end{Bmatrix} = dfrac{1}{k!}sum_{i=0}^k (-1)^{k-i} {kchoose i} imes i^n = sumlimits_{i=0}^k dfrac{(-1)^{k-i} imes i^n}{(k-i)! imes i!} ]

性质

与下降幂的关系:

[x^{n} = sumlimits_{i=0}^n egin{Bmatrix} n\i end{Bmatrix} x^{underline{i}} ]

证明:

显然 (n=0) 是成立的。对于其他情况,使用数学归纳法,假设 (n-1) 时该式成立——(x^{underline{n}} = xcdot x^{underline{n-1}} = sumlimits_{i=1}^{n-1} egin{Bmatrix} n-1\i end{Bmatrix} x cdot x^{underline{i}})

由于 (x^{underline{n}} cdot x = icdot x^{underline{n}} + (x-i)cdot x^{underline{n}} = icdot x^{underline{n}}+x^{underline{n+1}}),那么:

[sumlimits_{i=1}^{n-1} egin{Bmatrix} n-1\i end{Bmatrix} xcdot x^{underline{i}} \ = sumlimits_{i=1}^{n-1}left(egin{Bmatrix} n-1\i end{Bmatrix} icdot x^{underline{i}} + egin{Bmatrix} n-1\i end{Bmatrix}x^{underline{i+1}} ight)\ =sumlimits_{i=0}^n left(egin{Bmatrix}n - 1\ i - 1 end{Bmatrix} + i egin{Bmatrix}n- 1\ iend{Bmatrix} ight)x^{underline i} \ = sumlimits_{i=0}^n egin{Bmatrix} n\i end{Bmatrix} x^{underline i} ]

转化为上降幂形式:

[x^n = sumlimits_{i=0}^n(-1)^{n-i} egin{Bmatrix} n\i end{Bmatrix} x^{overline i} ]

斯特林反演

反转公式

[sumlimits_{i=j}^n (-1)^{n-i} egin{bmatrix} n\i end{bmatrix} egin{Bmatrix} i\j end{Bmatrix} = sumlimits_{i=j}^n (-1)^{i-j} egin{Bmatrix} n\i end{Bmatrix} egin{bmatrix} i\j end{bmatrix} = [n=j] ]

证明:

由上文得:

[x^n = sumlimits_{i=0}^n egin{Bmatrix} n\i end{Bmatrix} x^{underline i}, quad x^{underline{n}} = sumlimits_{i=0}^n (-1)^{n-i}egin{bmatrix} n\i end{bmatrix} x^i ]

将第二个代到第一个式子里面:

[x^{underline{n}} =sumlimits_{i=0}^n (-1)^{n-i}egin{bmatrix} n\i end{bmatrix} left(sumlimits_{j=0}^i egin{Bmatrix} i\ j end{Bmatrix}x^{underline{j}} ight)\ = sumlimits_{j=0}^n x_j left( sumlimits_{i=j}^n (-1)^{n-i} egin{bmatrix} n\i end{bmatrix} egin{Bmatrix} i\j end{Bmatrix} ight) ]

把最后的式子和 (x^{underline{n}}) 比对一下,发现 (sumlimits_{i=j}^n (-1)^{n-i} egin{bmatrix} n\i end{bmatrix} egin{Bmatrix} i\j end{Bmatrix} = [n=j])

同样的,将上面的式子从第一个代入第二个,会有:

[x^n = sumlimits_{j=0}^n x^j left(sumlimits_{i=j}^n (-1)^{i-j} egin{Bmatrix} n\j end{Bmatrix} egin{bmatrix} i\j end{bmatrix} ight) = sumlimits_{j=0}^n x^j[n=j] ]

得到反转公式:

[sumlimits_{i=j}^n (-1)^{n-i} egin{bmatrix} n\i end{bmatrix} egin{Bmatrix} i\j end{Bmatrix} = sumlimits_{i=j}^n (-1)^{i-j} egin{Bmatrix} n\i end{Bmatrix} egin{bmatrix} i\j end{bmatrix} = [n=j] ]

反演公式

[g(n) = sumlimits_{i=0}^n egin{Bmatrix} n\ i end{Bmatrix} f(i) quad Leftrightarrow quad f(n)= sumlimits_{i=0}^n (-1)^{n-i}egin{bmatrix} n\ i end{bmatrix} g(i) ]

证明:

若已知:

[f(n)= sumlimits_{i=0}^n (-1)^{n-i}egin{bmatrix} n\ i end{bmatrix} g(i) ]

那么:

[g(n) = sumlimits_{i=0}^n[i=n] g(i)\ = sumlimits_{i=0}^n sumlimits_{j=i}^n (-1)^{j-i} egin{Bmatrix}n\ jend{Bmatrix} egin{bmatrix}j\ iend{bmatrix} g(i)\ = sumlimits_{j=0}^n egin{Bmatrix}n\ jend{Bmatrix} sumlimits_{i=0}^j (-1)^{j-i} egin{bmatrix}j\ iend{bmatrix} g(i)\ = sumlimits_{j=0}^n egin{Bmatrix} n\ j end{Bmatrix} f(j) ]

于是其中一个得证,另一个反着做即可。

后记

原文地址:https://www.cnblogs.com/-Wallace-/p/comb-basic.html