zoukankan      html  css  js  c++  java
  • 组合计数基础

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

    排列数

    定义

    (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) ]

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

    后记

  • 相关阅读:
    oracle 查看运行中sql
    orcale 匿名代码块
    vsftpd 自动安装脚本
    js 第二篇 (DOM 操作)
    js 第一篇(常用交互方法)
    安装部署Solrcloud
    安装部署zookeeper集群
    zabbix-agent active 配置自动探测
    zabbix 3.2.4 安装
    python os模块 常用函数
  • 原文地址:https://www.cnblogs.com/-Wallace-/p/comb-basic.html
Copyright © 2011-2022 走看看