排列组合与方案统计问题

基础定义
加法原理
完成一件事情,可以有\(n\)类办法,在第一类办法中有\(m_1\)种不同的方法,在第二类办法中有\(m_2\)种不同的方法,……,在第\(n\)类办法中有\(m_n\)种不同的方法,那么完成这件事共有\(N = m_1 + m_2 + \cdots + m_n\)种不同的方法。
例如,从武汉到上海有乘火车、飞机、轮船\(3\)种交通方式可供选择,而火车、飞机、轮船分别有\(k_1\),\(k_2\),\(k_3\)个班次,那么从武汉到上海共有\(k_1 + k_2 + k_3\)种方式可以到达。
乘法原理
完成一件事情,需要分成\(n\)个步骤,做第一步有\(m_1\)种不同的方法,做第二步有\(m_2\)种不同的方法,……,做第\(n\)步有\(m_n\)种不同的方法,那么完成这件事有\(N = m_1×m_2×\cdots×m_n\)种不同的方法。
例如,在密码学中,一个由数字\(0\)~\(9\)组成的四位密码的可能性为\(10×10×10×10 = 10000\)种,因为每一位都有\(10\)种可能(\(0\)~\(9\) )。
两个原理的区别:一个与分类有关,另一个与分步有关。加法原理是“分类完成”,乘法原理是“分步完成”。
容斥原理
容斥原理的基本思想是先不考虑重叠的情况,把包含某内容的所有对象的数目先计算出来,然后再把计数时重复计算的数目排除,使计算的结果既无遗漏又无重复。这种方法可以使重叠部分不被重复计算,从而得到更准确的结果。
假设一个班级里有\(50\)名学生,其中\(20\)名学生参加了数学奥赛,\(30\)名学生参加了物理奥赛,\(15\)名学生同时参加了数学和物理奥赛。我们需要找出这个班级里一共有多少名学生参加了至少一项奥赛。
首先,把参加数学奥赛的学生数(\(20\)人)和参加物理奥赛的学生数(\(30\)人)加起来,得到\(50\)人。但是,这\(50\)人中包含了同时参加两项奥赛的\(15\)名学生,这部分学生被重复计算了一次。所以需要从总数中减去这\(15\)名学生,以消除重复计数。
故最终参加至少一项奥赛的学生数为:
\(20\)(参加数学奥赛)$ + 30\((参加物理奥赛)\)- 15\((同时参加两项奥赛)\) = 35$人。
容斥原理的集合形式如下:
两个集合:\(A\cup B = A + B - A\cap B\)
三个集合:\(A\cup B\cup C = A + B + C - A\cap B - B\cap C - C\cap A + A\cap B\cap C\)
\(N\)个集合:
\(\vert A_1\cup A_2\cup\cdots\cup A_n\vert = \sum_{1\leq i\leq n}\vert A_i\vert - \sum_{1\leq i < j\leq n}\vert A_i\cap A_j\vert + \sum_{1\leq i < j < k\leq n}\vert A_i\cap A_j\cap A_k\vert - \cdots + (-1)^{n - 1}\vert A_1\cap A_2\cap\cdots\cap A_n\vert\)
排列数
在 \(n\) 个元素集中选 \(m\) 个组成一个有序子集,有多少种不同子集?
将这个值记为 \(A_n^m\)
\(A_n^m = {{n!}\over{(n-m)!}}\)
下面是理论证明
从 \(n\) 个元素中选取 \(m\) 个元素的方案为
\(n*(n-1)*...*(n - m + 1)\)
这里要加一是因为直接 \(n-m\) 子集的大小就多了一,所以要加上
\(\qquad A_n^m\)
\(= n*(n-1)*...*(n - m + 1)\)
\(={(n*(n-1)*...*(n - m + 1) * (n - m) * (n - m - 1)*...*1) \over {(n - m) * (n - m - 1)*...*1}}\)
\(={n! \over (n - m)!}\)
证毕
组合数
那么如果这个子集是无序的,子集方案数记为
\(C_{n}^{m} = \tbinom{n}{m}\)
这里C和大圆括号的\(n,m\)上下就是相反的,没打错
\(C_{n}^{m} = {{n!}\over{m!(n-m)!}}\)
下面证明
已知 \(A_n^m = {{n!}\over{(n-m)!}}\) 要把重复集合去掉
对于任意一个元素数量为 \(m\) 的集合,期中元素的排列组合数为 \(m!\)
由于排列数对于任意一个长度为 \(m\) 的组合都重复计算了 \(m!\) 次,故将 \(A_n^m\) 除掉 \(m!\) 即可。 故
\(C_{n}^{m} = {{A_n^m}\over{m!}} = {{n!}\over{m!(n-m)!}}\)
组合数恒等式
帕斯卡 / 杨辉三角公式
\(C_{n}^{m} = C_{n-1}^{m} + C_{n-1}^{m-1}\)
证明
从\(n\)个元素的集合\(S\)中选\(m\)个作为子集,对于 \(a \in S\), 有2中情况
-
\(a\) 不在子集中,那么方案为
\(C_{n - 1}^{m}\)
因为不选a,所以集合中有效元素减少为 \(n-1\) 个
-
\(a\) 在子集中,那么方案为
\(C_{n - 1}^{m - 1}\)
因为已经确定1个元素了,那么有效集和子集都各减少了1个名额
因为
\(在n中选m = 选a的情况 + 不选a的情况\)
所以
\(C_{n}^{m} = C_{n - 1}^{m} + C_{n - 1}^{m - 1}\)
证毕
基础问题
盒子与球问题
现在有 \(n\) 个球, \(m\) 个盒子, 要将球放在盒子中
| 盒子 | 是否可以存在空盒子 | |
|---|---|---|
| 球 | 相同 | 不同 |
| 盒子 | 相同 | 不同 |
| 是否可以存在空盒子 | 可以为空 | 不可以为空 |
总共存在 \(8\) 种子问题
1. 球相同, 盒子不同, 不能存在空盒子
隔板法, 想象将 \(n\) 个球拍成一列, 在每两个球之间的都可以插入一个隔板,总共有\(n-1\)个缝隙给你插。 隔板就起到了分割球分属不同盒子的作用, 总共插入 \(m - 1\) 个隔板, 答案就为 \(C_{n-1}^{m-1}\)
就像这样
O | O |O O
结论为 \(C_{n-1}^{m-1}\)
2. 球相同, 盒子不同, 可以存在空盒子
假设现在每个盒子里放置一个球,一共多放置 \(m\) 个球, 现在就等价为情况 \(1\).
结论为: \(C_{n + m -1}^{m-1}\)
3. 球相同, 盒子相同, 可以存在空盒子
我们设 \(f[n][m]\) 为将 \(n\) 个球放在 \(m\) 个盒子里的方案数
如果 \(n < m\), 那么此时必然存在至少 \(m-n\) 个空盒子,由于盒子相同,所以可以直接将这些空盒子扔掉, 故 \(f[n][m] = f[n][n] (n < m)\)
如果 \(n>=m\),此时可以选择将所以盒子都有球或部分盒子没球
(1) 让部分盒子没球, 那么方案数从 \(f[i][j-1]\) 继承
(1) 盒子都有球, 那么方案数从 \(f[i - j][j]\) 继承
\(f[i][j] = f[i][j-1] + f[i-j][j]\)
如果没有球或者只有一个盒子,此时方案数为1,即 \(f[i][1] = f[0][j] = 1\)
for(ll i = 0;i <= n;i++){
for(ll j = 1;j <= m;j++){
if(j == 1|| i == 0) {
f[i][j] = 1;
continue;
}
if(i < j) {
f[i][j] = f[i][i];
continue;
}
f[i][j] = f[i-j][j]+f[i][j-1];
}
}
4. 球相同, 盒子相同, 不能存在空盒子
先给每个箱子分一个球,总共分 \(m\) 个球, 接下来就把剩下的 \(n-m\) 个球随便分就行了,就像 (3) 一样
5. 球不同, 盒子不同, 可以存在空盒子
每个球都有 \(m\) 个盒子选择, 故答案为 \(m^n\)
结论为: \(m^n\)
6. 球不同,盒子相同,无空盒
这个问题需要拓展第二类斯特林数。
将 $ S_2(n,m) $ 读作关于 $ n,m $ 的第二类斯特林数。
两种求法:
-
递推:
$ S_2(n,m) = S_2(n - 1, m - 1) + mS_2(n - 1, m) $
单独看第一个球,如果第一个球独立存在于一个盒子里面。那么就是 $ S_2(n - 1, m - 1) $。
如果不是如此,那么就是把这个球放在任意的盒子里面。也就是在 $ S_2(n - 1, m) $ 的情况下,找一个盒子塞进去一个球,因为有 $ m $ 个盒子所以就乘 $ m $。 -
容斥:
$ S_2(n,m) = \frac{1}{m!} \sum_{k = 0}^{m} (-1)^k C_m^k (m - k)^n $
(说实话可能需要用到多项式的知识,所以完全不会)
联系问题5,问题6还可以得到一个性质
$ n^k = \sum_{i = 0}^{k} S_2(k, i) * i! * C_n^i$
什么意思呢?
左边指的是,$ k $ 个球任意的放在 $ i $ 个盒子里(5)
右边,我们枚举有多少个非空的盒子数 $ i $(盒子不同,乘上 $ i! $),再乘上我们选盒子的方案数。
S[0][0]=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
S[i][j]=S[i-1][j-1]+j*S[i-1][j];
}
}
7. 球不同,盒子不同,无空盒
与上面问题6基本相同,只需要乘 $ m! $ 即可,结果为 $ m! * S_2(n,m) $。
8. 球不同,盒子相同,有空盒
也是对6的拓展,只需要枚举非空盒子的对应的方案数量即可,即 $ \sum_{i = 1}^{m} S_2(n,i) $。
对于这个问题我们再引入一个数列——贝尔数。
贝尔数 $ B_n $ 更常见的定义为,将 $ n $ 个数的集合所有的划分方式,你可以认为这是问题8在盒子数与球数相同时的解。
它有一个递推公式:
$ B_{n + 1} = \sum_{k = 0}^{n} C_n^k B_k $
证明:
假设,$ B_{n + 1} $ 是含有 $ n + 1 $ 个元素集合的划分个数。
先单独拿出一个元素。
- 这个元素分为一类,剩下 $ n $ 个元素,有 $ C_n^n B_n $;
- 这个元素和某1个单独元素分成一类,$ C_n^{n - 1} B_n $;
- 这个元素和某2个单独元素分成一类,$ C_n^{n - 2} B_n $;
求和可得。
在关注问题8和贝尔数就可以得到贝尔数和第二类斯特林数的关系:
$ B_n = \sum_{k = 0}^{n} S_2(n,k) $
错位排列问题
现在又一个长度为 \(n\) 的序列 \(A\), $A_i = i $
求满足 $A'_i \neq i $ 的 \(A\) 的排列的数量
我们记长度为 \(n\) 的错位排列数量为 \(d(n)\)
首先, 数字 \(n\) 不可以放在 \(A'[n]\)
对于剩下 \(n-1\) 个数的错位排序
假设第 \(n\) 封信 \(a\) 占据了 \(b\) 的位置 , 那么此时 \(b\) 放在哪个信封分两种情况 , \(b\) 放在 \(a\) 位置 , 或 \(b\) 不放在 \(a\) 位置
(1)第一类:第一种情况是 \(b\) 放在 \(a\) 位置,剩下 n 一 2 封信进行错排,方案数是 \(d(n-2)\)
(2) 第二种情况是 \(b\) 没有去 \(a\) 的位置,那么 \(b\) 可能出现在除 \(a\) 之夕卜的可位置, \(b\) 有 \(n-2\) 个位置可以去,不能去 \(a\), \(b\) 位置其余所有元素都有 \(n-2\) 个位置可以去 (a, b 已占用位置不能去),这种情况下相当于除 \(a\) 之外的其它元素的错排问题,即 \(n-1\) 个元素的错排问题,方案数是 d(n-1)
加法原理, 此时除去第 \(n\) 封信, 其他总共有 \(d(n-1)+d(n-2)\) 种可能
结论就是 \(d(n) = (n-1)*(d(n-1)+d(n-2))\)

浙公网安备 33010602011771号