简谈排列组合和容斥原理

· · 算法·理论

基础组合计数和容斥原理

因为是数学,所以今天的代码会额外的少,我会分几个板块来阐述今天的内容。

一、基本计数原理

如图,点 1 和点 2 之间有三条不同的路线,那么就有 1+1+1=3 种情况。

同样来举个栗子:

我们由上面的加法原理可知,点1到点2共有2种情况,点2到点3共有3种情况,则点1到点3共有 2\times 3=6 种情况。

讲完了基本计数原理,我们就可以学习下一个篇章了。

二、排列组合

基本公式 A_n^m=\frac{n!}{(n-m)!}

基本公式 C_n^m=\frac{n!}{(n-m)!m!}

有了这些基础,我们有了以下推导。

Lucas定理:对于质数 p\le n 的情况可以使用:

C_n^m \equiv C_{n\bmod p}^{m\bmod p}C_{{\lfloor \frac{n}{p}\rfloor}}^{{\lfloor \frac{m}{p}\rfloor}}\pmod p

- 由于此处重点,所以我提供了代码实现:

int Lucas(int n,int m)
{
    if(m == 0) return 1;
    return C(n%p, m%p) * Lucas(n/p, m/p) % p;
}

(二)插空法

(三)隔板法

我们想求杨辉三角中一列数字之和(红框),只需要求出图中篮框数字即可。

  1. 范德蒙德卷积: \sum\limits_{i=0}^{n}C_x^iC_y^{n-i}=C_{x+y}^{n}
  2. 二项式定理: (x+y)^n=\sum\limits_{i=0}^nC_n^ix^iy^{n-i}
  3. kC_n^k=nC_{n-1}^{k-1}
  1. 多重集的组合, S=\{n_1a_1,n_2a_2,...,n_ka_k\},r\le n_i(\forall i\epsilon[1,k]) ,从 S 中取出 r 个元素组成一个多重集,产生的不同多重集的数量为 C_{k+r-1}^{k-1}

三、容斥原理

  1. |A \cup B \cup C|=|A|+|B|+|C|-|A \cap B|-|A \cap C|-|B \cap C|+|A \cap B \cap C|

A_1, A_2, \dots, A_n 是有限集合,则它们的并集的大小为:

\left| \bigcup_{i=1}^n A_i \right| = \sum_{i=1}^n |A_i| - \sum_{1 \leq i < j \leq n} |A_i \cap A_j| + \sum_{1 \leq i < j < k \leq n} |A_i \cap A_j \cap A_k| - \dots + (-1)^{n+1} \left| \bigcap_{i=1}^n A_i \right|

简记形式:

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

概率版本:

对于概率空间中的事件 A_1, A_2, \dots, A_n

P\left( \bigcup_{i=1}^n A_i \right) = \sum_{k=1}^n (-1)^{k+1} \sum_{1 \leq i_1 < \dots < i_k \leq n} P(A_{i_1} \cap \dots \cap A_{i_k})

总结

"千里之行,始于足下。" —— 老子

面对困难与挑战,遥远的路途,我们要敢于向前,敢于拼搏,走出属于自己的路,走出踏踏实实的路。

向着理想的银河迈进!