📅  最后修改于: 2023-12-03 15:11:25.505000             🧑  作者: Mango
离散数学是计算机科学中的重要基础学科之一,而计数理论则是离散数学中的重要分支。计数理论主要研究的是如何统计给定条件下的个数,是算法设计过程中必不可少的知识点之一。
乘法原理:若有$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|$$
A1:这种情况下我们通常需要使用容斥原理来计算方案数。先计算出从$n$个元素中选出$k$个元素的所有方案数,再减去其中有不合法的方案数,加上其中有两个或更多个不合法的方案数,$\dots$,最后根据容斥原理得到答案。
A2:这种情况下我们通常需要使用下面的步骤:
A3:在计算过程中,可适当使用斯特林公式、逆元、容斥原理等方法来避免超出计算机存储范围导致的溢出错误。如果无法避免溢出,可使用高精度库实现计算,但要注意时间复杂度的影响。