📜  离散数学-计数理论(1)

📅  最后修改于: 2023-12-03 15:11:25.505000             🧑  作者: Mango

离散数学-计数理论

离散数学是计算机科学中的重要基础学科之一,而计数理论则是离散数学中的重要分支。计数理论主要研究的是如何统计给定条件下的个数,是算法设计过程中必不可少的知识点之一。

基本概念
  • 置换:对于集合$[n]={1,2,\dots,n}$的一种排列称为置换,通常用$\sigma$表示,写成$\sigma=(\sigma(1),\sigma(2),\dots,\sigma(n))$。
  • 逆置换:若$\sigma=(\sigma(1),\sigma(2),\dots,\sigma(n))$是$[n]$的一个置换,那么$\sigma$的逆置换为$\sigma^{-1}=(\sigma^{-1}(1),\sigma^{-1}(2),\dots,\sigma^{-1}(n))$,其中$\sigma^{-1}(i)$表示数$i$在$\sigma$中的位置。
  • 轮换:设$\sigma$是$[n]$的一个置换,如果存在一些正整数$k_1,k_2,\dots,k_t$,满足$k_1+k_2+\dots+k_t=n$,且对于$1\leq i\leq t$,有$\sigma(j)=j+k_i(\bmod n)$对$j\in{1,2,\dots,k_i}$成立,那么$\sigma$称为$t$个$k_1,k_2,\dots,k_t$的轮换。
  • 循环指数:设$\sigma$是$[n]$的一个置换,$l(\sigma)$表示$\sigma$的轮换个数,$len(\sigma)$表示$\sigma$的轮换长度的最小公倍数,$k(\sigma)=\frac{n}{len(\sigma)}$为$\sigma$的循环指数。
计数方法
  • 乘法原理:若有$m$个事件,每个事件有$n_i$种可能,那么这$m$个事件组成的复合事件,共有$n_1\times n_2\times\dots\times n_m$种可能。

  • 加法原理:若一个事件可以分为$k$个不相交的子事件,且每个子事件有$n_i$种可能,那么该事件有$n_1+n_2+\dots+n_k$种可能。

  • 排列:$n$个元素中选$k$个元素进行排列的方案数为$A_n^k=\frac{n!}{(n-k)!}$,其中$n!$表示$n$的阶乘,$(n-k)!$表示$(n-k)$的阶乘。

  • 组合:$n$个元素中选$k$个元素进行组合的方案数为$C_n^k=\frac{n!}{k!(n-k)!}$。

  • 容斥原理:对于$n$个集合的 Union,设集合$A$至少被选了$a$次,集合$B$至少被选了$b$次,$\dots$,集合$N$至少被选了$n$次,那么计算式子如下:

    $$\left| \bigcup_{i=1}^{n} A_i \right|=\sum_{S\subseteq{1,2,\dots,n}} (-1)^{|S|-1} \left|\bigcap_{i\in S} A_i\right|$$

常见问题
Q1:从$n$个元素中选出$k$个元素进行排列/组合,并且这$k$个元素要满足一些限制条件,如何计算方案数?

A1:这种情况下我们通常需要使用容斥原理来计算方案数。先计算出从$n$个元素中选出$k$个元素的所有方案数,再减去其中有不合法的方案数,加上其中有两个或更多个不合法的方案数,$\dots$,最后根据容斥原理得到答案。

Q2:对$n$个元素进行排列/组合,但是排列/组合的结果不能出现某些元素,如何计算方案数?

A2:这种情况下我们通常需要使用下面的步骤:

  1. 先计算出$n$个元素进行排列/组合的所有方案数;
  2. 计算出指定元素都不在排列/组合结果中的方案数;
  3. 用总方案数减去不合法的方案数,得到合法的方案数。
Q3:计数时遇到超大数怎么办?

A3:在计算过程中,可适当使用斯特林公式、逆元、容斥原理等方法来避免超出计算机存储范围导致的溢出错误。如果无法避免溢出,可使用高精度库实现计算,但要注意时间复杂度的影响。