组合数学学习笔记
定义
公式
组合数求法
-
当范围较小时,使用加法原理 \(O(n^2)\) 求组合数(杨辉三角)
-
当范围较大时用定义式,对大质数 \(p\) 取模时 \(O(n)\) 预处理阶乘与阶乘逆元
int fac[maxn], inv[maxn], invfac[maxn]; fac[0] = inv[1] = invfac[0] = 1; rep(i, 2, n) inv[i] = (p - p / i) * inv[p % i] % p; rep(i, 1, n) fac[i] = fac[i - 1] * i % p; rep(i, 1, n) invfac[i] = inv[i] * invfac[i - 1] % p; -
范围更大无法处理阶乘时可以使用 Lucas 定理,时间复杂度 \(O(\log_pn)\)
Lucas 定理
ll fac[maxn], invfac[maxn], inv[maxn];
ll lucas(ll x, ll y) {
if(x < y) return 0;
if(x < p) return fac[x] * invfac[y] * invfac[x - y] % p;
return lucas(x / p, y / p) * lucas(x % p, y % p) % p;
}
球与盒子模型
1) 球相同 盒不同 无空盒
隔板法,相当于在 \(n-1\) 个位置插 \(m-1\) 个隔板,答案为 \(\dbinom{n-1}{m-1}\)
2) 球相同 盒不同 有空盒
加入 \(m\) 个“虚球”,接下来同无空盒,最终答案为 \(\dbinom{n+m-1}{m-1}\)
3) 球不同 盒相同 无空盒
第二类斯特林数。
设 \(f_{i,j}\) 为 \(i\) 个小球放在 \(j\) 个盒子里且每个盒子不空的方案数,则 \(f_{i,1} = f_{i,i} = 1\),转移为 \(f_{i,j}=j\times f_{i-1,j}+f_{i-1, j - 1}\)
int f[15][15];//表示n个小球放进m个盒子里且每个盒子不空的方法数
rep(i, 1, n) f[i][1] = 1, f[i][i] = 1;
rep(i, 1, n) rep(j, 2, m) f[i][j] = f[i - 1][j] * j + f[i - 1][j - 1];
4) 球不同 盒相同 有空盒
同无空盒,最后统计答案时枚举使用了几个盒子即可
5) 球不同 盒不同 无空盒
同 3),在统计答案时乘上 \(m\) 的全排列数即可。
6) 球不同 盒不同 有空盒
基本同 4),统计答案为 \(\sum_{i=1}^mf_{n,i}\times A_m^i\)
7) 球相同 盒相同 无空盒
基本同 8)
8) 球相同 盒相同 有空盒
设 \(f_{i,j}\) 为 \(i\) 个小球放在 \(j\) 个盒子里的方案数,则 \(f_{i,j}=f_{i-1, j-1} + f_{i-j,j}\)。(第 \(j\) 个盒子放不放第 \(i\) 个球的两种情况)
答案为 \(\sum_{i=1}^mf_{n,i}\)
例题
P1595 信封问题
错排问题裸题。
设 \(D_n\) 表示 \(n\) 个元素的错排个数,我们来分析一下递推过程:
假设现在放了 \(n-1\) 个元素,第 \(n\) 个元素假设放在了 \(k\) 的位置,则 \(k\) 号元素有如下两种选择:
- 放在位置 \(n\) 上,这样剩下的问题变成了 \(D_{n-2}\)
- 不放在位置 \(n\) 上,这样剩下的问题变成了 \(D_{n-1}\)
再考虑到 \(k\) 有 \(n-1\) 种取值,则 \(D_n=(n-1)\times(D_{n-1}+D_{n-2})\)
P4071 [SDOI2016]排列计数
\(n-m\) 个元素的错排问题,再乘上 \(\dbinom{n}{m}\) 即可

浙公网安备 33010602011771号