组合与排列
组合与排列
一、插板法
1、用处:用于求一类相同元素分组的方案数,也可以用于求一类线性不定方程解的组数。
2、求正整数和的组合数目:
-
题目:有 \(n\) 个完全相同的元素,分为 \(k\) 组,保证每组至少有一个元素,求分配方案?
-
解法:我们可以考虑把 \(k-1\) 快板子插入到 \(n\) 哥元素两两形成的 \(n - 1\) 哥空里面,又因为是元素是相同的,则答案为 \(C_{n - 1}^{k - 1}\)。
-
其实本质上就是求 \(x_1 + x_2 + ... + x_k = n\) 这个方程的正整数解的组数。
3、求非负整数和的组合数目:
-
题目:和求正整数和的数目一样,唯一的区别就是我们允许每组可以为空。
-
解法:由于可能会导致多块板子插入到一个空里面,那么可以借来 \(k\) 个元素,那么 \(n + k\) 个元素就会形成 \(n + k - 1\) 个空,答案则为 \(C_{n + k - 1}^{k - 1} = C_{n + k - 1}^{n}\)。
-
本质上就是求 \(x_1 + x_2 + ... + x_k = n\) 这个方程的非负整数解的组数。
4、求不同下界整数和的组合数目:
-
题目:和上面两个的区别就是第 \(i\) 组必须分到 \(a_i\) 个元素,且保证 \(\sum a_i \le n\),求方案数?
-
解法:我们令 \(x_{i}' = x_{i} - a_{i}\),有本质上我们求的是 \(x_1 + x_2 + ... + x_k = n\) 的解的组数,那么转化一下就是 \(x_1' + a_1 + x_2' + a_2 + ... + x_k' + a_k = n\) ,然后就是求 \(x_1' + x_2' + ... + x_k' = n - \sum a_i\) 的非负整数解的组数,答案就是 \(C_{n - \sum a_i + k - 1}^{n - \sum a_i} = C_{n - \sum a_i + k - 1}^{k - 1}\)。
5、求不相邻的排列组合数:
-
题目:\(1\) ~ \(n\) 这 \(n\) 个自然数中选 \(k\) 个。
-
解法:这 \(k\) 个数中任何两个数都不相邻的组合有 \(C_{n - k + 1}^{k}\)。
二、二项式定理
1、二项式展开:\((a + b)^{n} = \sum_{i = 0}^{n}C_{n}^{i}a^{n - i}b^{i}\)。
2、推广:\((x_1 + x_2 + ... + x_t)^{n} = \sum_{满足n_1 + n_2 + ... + n_t = n的非负整数解}C_{n}^{n_1}C_{n}^{n_2}...C_{n}^{n_t}x_1^{n_1}x_2^{n_2}...x_t^{n_t}\)。
3、其中 \(C_{n}^{n_1}C_{n}^{n_2}...C_{n}^{n_t}\) 就是多项式系数,那么我们可以得到 \(\sum C_{n}^{n_1}C_{n}^{n_2}...C_{n}^{n_t} = t^{n}\)。
三、进阶篇
1、多重集的排列数和多重组合数
- 多重集指的是含有重复元素的广义集合。设 \(S = \left \{ n_1·a_1,n_2·a_2,...,n_k·a_k \right \}\) 表示有 \(n_1\) 个 \(a_1\),\(n_2\) 个 \(a_2\) \(...\) \(n_k\) 个 \(a_k\) 组成的多重集,则\(S\) 的全排列个数为:\(\frac{n!}{\prod_{i=1}^{k}n_i!} = \frac{n!}{n_1!n_2!...n_k!}\) ,相当于把相同元素的排列数除去了。具体的,可以认为有 \(k\) 个不同的球,每个球的数目分别为 \(n_1, n_2,...n_k\),且 \(n = n_1 + n_2 + ... + n_k\) 。求这 \(n\) 个球的全排列数就是多重集的排列数,也叫多重组合数。
2、多重集的组合数1
- 设 \(S = \left \{ n_1·a_1,n_2·a_2,...,n_k·a_k \right \}\) 表示有 \(n_1\) 个 \(a_1\),\(n_2\) 个 \(a_2\) \(...\) \(n_k\) 个 \(a_k\) 组成的多重集,那么对于整数 \(r(r <= n_i, \forall i \in \left [ 1,k \right ] )\) ,从 \(S\) 中选择 \(r\) 个元素组成一个多重集的方案数就是多重集的组合数 (条件很重要)。这个问题有等价于 \(x_1 + x_2 + ... + x_k = r\) 的非负整数的数目,可用插板法解决,答案则为 \(C_{r + k - 1}^{k - 1}\)。
3、多重集的组合数2
-
和组合数1的区别就是 \(r\) 不一定都小于等于所有的 \(n_i\)。
-
即带限制的线性方程求解:\(\forall i \in \left [ 1, k \right ], x_i \le n_i, \sum_{i = 1}^{k}x_i = r\)。
-
于是我们就可以用容斥来解决:
\((1)\) 全集:\(\sum_{i = 1}^{k} x_i = r\) 的非负整数解。
\((2)\) 属性:\(x_i \le n_i\)。
-
我们设满足属性 \(i\) 的集合是 \(S_i\) ,则 \(\bar{S_i}\) 表示不满足属性 \(i\) 的集合,即满足 \(x_i >= n_i + 1\) 的集合,那么答案即为:\(\left | \bigcap_{i=1}^{k}S_i \right | = \left | \cup \right | - \left | \bigcup_{i=1}^{k}\bar{S_i} \right |\)。
-
根据容斥原理得:\(\left | \bigcup_{i=1}^{k}\bar{S_i} \right | = \sum_{i} |\bar{S_i}|-\sum_{i,j} |\bar{S_i} \cap \bar{S_j}| + ... + (-1)^{k-1}|\bigcap_{i=1}^{k}\bar{S_i}| = \sum_{i}C_{r+k-n_i-2}^{k-1}-\sum_{i,j}C_{r+k-n_i-n_j-3}^{k-1}+...+(-1)^{k-1}C_{r-1-\sum_{i=1}^{k}n_i}^{k-1}\),又因为 \(| \bigcup | = C_{r+k-1}^{k-1}\) ,则可以求出解,可以看出 \(k \le 20\) 一般才能求出此解,时间复杂度为:\(k(1<<k)\)。
四、圆排列
1、定义:\(n\) 个人围成一圈,我们记所有的排列数为 \(Q_{n}^{n}\),记 \(A_{n}^{n}\) 为\(n\) 个人排成一排的所有排列数。那么我们可以把圈看成排,相当于从不同位置断开,所以有 \(Q_{n}^{n} * n = A_{n}^{n} \Rightarrow Q_{n}^{n} = \frac{A_{n}^{n}}{n}=(n-1)!=A_{n-1}^{n-1}\)。
2、由此我们可以推出:\(Q_{n}^{r}=\frac{A_{n}^{r}}{r}=\frac{n!}{r(n-r)!}\)。
五、组合数性质和二项式推论
1、\(C_{n}^{m} = C_{n}^{n-m}\)。
2、\(C_{n}^{k}=\frac{k}{n}C_{n-1}^{k-1}\)。
3、\(C_{n}^{m}=C_{n-1}^{m}+C_{n-1}^{m-1}\)。
4、\(\sum_{i=0}^{n}C_{n}^{i}=2^n\)。
5、\(\sum_{i=0}^{n}(-1)^iC_{n}^{i}=[n=0]\)。
6、\(\sum_{i=0}^{m}C_{n}^{i}C_{m}^{m-i}=C_{n+m}^{m}(m \le n)\)。
7、\(\sum_{i=0}^{n}(C_{n}^{i})^2=C_{2n}^{n}(式子6的特殊形式,即n=m)\)。
8、\(\sum_{i=0}^{n}iC_{n}^{i}=n2^{n-1}(带权式子)\)。
9、\(\sum_{i=0}^{n}i^2C_{n}^{i}=n(n+1)2^{n-2}\)。
10、\(\sum_{l=0}^{n}C_{l}^{k}=C_{n+1}^{k+1}\)。
11、\(C_{n}^{r}C_{r}^{k}=C_{n}^{k}C_{n-k}^{r-k}\)。
12、\(\sum_{i=0}^{n}C_{n-i}^{i}=F_{n+1}(其中F为斐波那契函数)\)。
六、二项式反演
1、我们令 \(f_n\) 为表示恰好使用 \(n\) 个不同元素形成的特定结构的方案数,\(g_n\) 表示从 \(n\) 个元素里面选 \(i \ge 0\) 个元素形成特定结构的总方案数。
2、若已知 \(f_n\) 求 \(g_n\) ,则有:\(g_n = \sum_{i=0}^{n}C_{n}^{i}*f_i\)。
3、若已知 \(g_n\) 求 \(f_n\) ,则有:\(f_n = \sum_{i=0}^{n}(-1)^{n-i}C_{n}^{i}g_i\)。
4、则上述 \(g_n\) 求 \(f_n\) 的过程则为,二项式反演。

浙公网安备 33010602011771号