组合计数问题的基本技巧

本文将探讨有关组合计数问题的基本技巧。

基本的排列组合

排列:从\(n\)个不同的物品里面选取\(k\)个物品出来并进行排列,共有多少种方法?

\[ans=A_n^k=n(n-1)...(n-k+1)=\frac{n!}{(n-k)!}\]
第一个物品有\(n\)种选法,第二个物品有\(n-1\)种选法,...,第\(k\)个物品有\(n-k+1\)种选法。

全排列:将\(n\)个不同的物品进行排列,共有多少种方法?

\[ans=A_n^n=n!\]

有重复物品的全排列:从\(m\)种不同的物品进行排列,其中第\(i\)物品有\(n_i\)个,共有多少种方法?

相当于首先对所有物品进行全排列,然后除掉同种物品产生的重复排列。
\[令n = n_1+n_2+...+n_m\]
\[ans=\frac{A_n^n}{\prod_{i=1}^mA_{n_i}^{n_i}}=\frac{n!}{n_1!n_2!...n_m!}\]

  • \(m=2\)
    \[ans=\frac{n!}{n_1!n_2!}=C_{n}^{n_1}=C_n^{n_2}\]

环形排列:从\(n\)个不同的物品里面选取\(k\)个物品出来并排成一个圈,共有多少种方法?

一个k环形排列从任意位置断开都可以得到一个k排列,也就是k排列个数是k环形排列个数的k倍
\[ans = \frac{A_n^k}{k} \]

环形全排列:将\(n\)个不同的物品排成一个圈,共有多少种方法?

\[ans=\frac{A_n^n}{n}=(n-1)!\]

组合:从\(n\)个不同的物品里面选取\(k\)个物品,共有多少种方法?

\[ans=C_n^k=\frac{n!}{k!(n-k)!}\]

可重复选取的组合:从n种物品中取出k个物品,每种物品可以重复出现,共有多少种方法?

如果第\(i\)种物品选取\(x_i\)个,原问题变成了求: \(x_1+x_2+...+x_n=k\)有多少个非负整数解。请参考【不定方程解的计数】一节。
\[ans=H_n^k = C_{n+k-1}^{k}\]

确定每类个数的二分类:将\(n\)个物品分为2类,每类的个数分别\(k\)\(n-k\),求分类方法数?

在n个元素里选取k个物品作为第一类,其他的作为第二类。
\[ans=C_n^k\]

确定每类个数的多分类:将\(n\)个物品分为\(m\)类,每类的个数分别\(n_1,n_2,...,n_m\),求分类方法数?

考虑将\(n_1\)个一号标签,\(n_2\)个二号标签,...,\(n_m\)\(m\)号标签分放(排列)到\(n\)个物品上,得到第\(i\)号标签的物品归为第\(i\)类,则分类问题变成了【有重复物品的全排列】,这里用于排列的物品就是标签。
\[ans=\frac{n!}{n_1!n_2!...n_m!}\]

基本组合恒等式

\[C_n^k = C_n^{n-k}\]

\(n\)个物品里选出\(k\)个物品的相当于\(n\)个物品里选出\(n-k\)个物品扔掉,而选取剩下的物品。

\[C_n^k = C_{n-1}^{k-1}+C_{n-1}^{k} \]

\(n\)个物品里选出\(k\)个物品,可以选取第一个物品,然后在剩下的\(n-1\)个物品里选\(k-1\)个,也可以不选第一个物品,然后在剩下的\(n-1\)个物品里选\(k\)个。

\[C_n^kC_k^m=C_n^mC_{n-m}^{k-m}, (n \geq k \geq m)\]

考虑将\(n\)个不同的物品放入到三个盒子里,其中第一个盒子要放\(n-k\)个物品,第二个盒子要放\(k-m\)个物品,第三个盒子要放\(m\)个物品。有两种等价的分放策略,分别代表上式的左右两边:

  • 先从\(n\)个物品里选取\(k\)个,把未选上的放入第一个盒子。再从选出的\(k\)个物品里选出\(m\)个放到第三个盒子,其余的放到第二个盒子。
  • 先从\(n\)个物品里选取\(m\)个放入第三个盒子。再从剩下的\(n-m\)个物品里选出\(k-m\)个物品放到第二个盒子,其余的放到第一个盒子。

上式取\(m=1\)得到:

\[C_n^k=\frac{n}{k}C_{n-1}^{k-1} \]

二项式定理:

\[(1+x)^n = C_n^0+C_n^1x+C_n^2x^2+...+C_n^nx^n = \sum_{i=0}^nC_n^ix^i\]

等式左边有\(n\)个连乘项,要得到\(x^k\)项,需要在\(n\)个连乘项中取\(k\)\(x\)\(n-k\)个1相乘。所以\(x^k\)的系数为\(C_n^k\)

\(x=1\)\(x=-1\)可以得到:

\[C_n^0+C_n^1+C_n^2+...+C_n^n = 2^n\]
\[C_n^0-C_n^1+C_n^2-C_n^3+...+(-1)^nC_n^n = 0\]

不定方程解的计数

\(\sum_{i=1}^kx_i=n\)有多少个正整数解?

挡板法:考虑有\(n\)个球排成一排,球与球之间总共有\(n-1\)个间隙,将\(k-1\)块挡板插入这些间隙中,可以把球分成\(k\)块。每种分块方法对应了原问题的一个解。
\[ans = C_{n-1}^{k-1}\]

\(\sum_{i=1}^kx_i=n\)有多少个非负整数解?

转化:令\(y_i=x_i+1\),因为\(x_i\)是非负整数,所以\(y_i\)是正整数。
\[\sum_{i=1}^ky_i=\sum_{i=1}^k(x_i+1)=\sum_{i=1}^kx_i+k=n+k\]
原问题转化为上一个问题,求下式中\(y_i\)有多少个正整数解。
\[\sum_{i=1}^ky_i=n+k\]
\[ans=C_{n+k-1}^{k-1}=C_{n+k-1}^{n}\]
挡板法:考虑把\(k-1\)块挡板和\(n\)个球共\(n+k-1\)个元素排成一排,\(k-1\)块挡板将球分成\(k\)块。第\(i\)块内球的个数则为\(x_i\)的值。注意到两块挡板可能相邻排着,也即\(x_i\)可能取\(0\)。这样的两种物品混合排列方法等同于上文【有重复物品的全排列】中\(m=2\)的情形。
\[ans=C_{n+k-1}^{k-1}\]

几何分割问题

n条直线最多有多少个交点?

每两条直线最多有且只有一个交点。
\[ans=C_n^2\]

考虑逐条画直线,画出第一条直线时没有任何交点;画第二条直线时可以和第一条有一个交点;画第三条直线时可以和前两条直线各有一个交点;画第\(i\)条直线时可以和前\(i-1\)条直线各有一个交点。交点总数为:
\[ans=0+1+2+...+(n-1) = \frac{(n-1)n}{2}=C_n^2\]

n条直线最多把平面分成多少块?

考虑逐条画直线,刚开始整个平面是一个块,画出第一条直线时多出一块;画第二条直线时,第一条直线把第二条直线分成两段,每段对应一个新产生的块;画第三条直线时,前两条直线把第三条直线分成三段,每段对应一个新产生的块;画第\(i\)条直线时,前\(i-1\)条直线把第\(i\)条直线分成\(i\)段,每段对应一个新产生的块。块的总数为:
\[ans=1+1+2+3+...+n=1+\frac{(1+n)n}{2}\]

错位排列

n个人每人写一张贺卡寄给一个人,且每人也收到一张贺卡,请问有多少种寄贺卡的安排方式?

原问题等价于求n个元素错位排列的方法数。一个有n个元素的排列,若其中所有的元素都不在自己原来的位置上,那么这样的排列就称为原排列的一个错位排列。

设答案为\(D_n\),则
\[D_n=(n-1)(D_{n-1}+D_{n-2})\]

证明:
显然有\(D_1=0\)\(D_2=1\)。当\(n\geq 3\)时,设\(n\)排在第\(k\)位,其中\(k\neq n\)。现在考虑数字\(k\)的摆放情况:

  • \(k\)排在第\(n\)位时,则除\(n\)\(k\)外的其他\(n-2\)个数的排列数,相当于一个\(n-2\)的错位排列数,即为\(D_{n-2}\)
  • \(k\)不排在第\(n\)位时,那么考虑:\(k\)不在第\(n\)位,除\(n\)\(k\)外的其他\(n-2\)不在自己的位子上的排列数。这相当于一个\(n-1\)的错位排列数,即为\(D_{n-1}\)

所以当\(n\)排在第\(k\)位时的错位排列共有\(D_{n-1}+D_{n-2}\)种,又\(k\)可以取\(1\)\(n-1\)的任意值,我们可以得到\(D_n=(n-1)(D_{n-1}+D_{n-2})\)

容斥原理(筛法公式)

下面用容斥原理的给出错位排列计数的表达式。

考虑一个排列的问题,设\(A_i\)代表一个排列中\(i\)放到了第\(i\)位上的事件。\(T_k\)代表某\(k\)个元素都放到了自己的位置上的事件。
我们有
\[|T_1|=|A_i| = (n-1)!\]
\[|T_2|=|A_i\cap A_j| = (n-2)!\]
\[|T_k|=|A_{i_1}\cap ... \cap A_{i_k}| = (n-k)!\]
其中\(|X|\)代表事件\(X\)可能出现的情况总数。

所有\(A_i\)的并代表至少有一个元素放到了原来位置上的事件:注意这个事件是和错位排列事件互补的,它们可能数的和为全排列\(n!\)。根据【容斥原理】有:
\[ \left|\bigcup_{i=1}^n A_i\right|=\sum_{i=1}^n\left|A_i\right| -\sum_{i,j\,:\,i\neq j}\left|A_i\cap A_j\right|+\sum_{i,j,k\,:\,i\neq j\neq k}\left|A_i\cap A_j\cap A_k\right|-\ \cdots\cdots\ \pm \left|A_1\cap\cdots\cap A_n\right| \]
\[=\sum_{i=1}^n(-1)^iC_n^i|T_i|=\sum_{i=1}^n(-1)^i\frac{n!}{i!(n-i)!}(n-i)!=-\sum_{i=1}^n(-1)^i\frac{n!}{i!}\]
故错位排列数为:
\[ D_n = n!-\left|\bigcup_{i=1}^n A_i\right| =n!+\sum_{i=1}^n(-1)^i\frac{n!}{i!}=n!(1+\sum_{i=1}^n(-1)^i\frac{1}{i!})=n!(\sum_{i=0}^n(-1)^i\frac{1}{i!})\]

你可能感兴趣的:(组合计数问题的基本技巧)