组合数学学习笔记
定义
公式
组合数求法
-
当范围较小时,使用加法原理 求组合数(杨辉三角)
-
当范围较大时用定义式,对大质数 取模时 预处理阶乘与阶乘逆元
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 定理,时间复杂度
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) 球相同 盒不同 无空盒
隔板法,相当于在 个位置插 个隔板,答案为
2) 球相同 盒不同 有空盒
加入 个“虚球”,接下来同无空盒,最终答案为
3) 球不同 盒相同 无空盒
第二类斯特林数。
设 为 个小球放在 个盒子里且每个盒子不空的方案数,则 ,转移为
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),在统计答案时乘上 的全排列数即可。
6) 球不同 盒不同 有空盒
基本同 4),统计答案为
7) 球相同 盒相同 无空盒
基本同 8)
8) 球相同 盒相同 有空盒
设 为 个小球放在 个盒子里的方案数,则 。(第 个盒子放不放第 个球的两种情况)
答案为
例题
P1595 信封问题
错排问题裸题。
设 表示 个元素的错排个数,我们来分析一下递推过程:
假设现在放了 个元素,第 个元素假设放在了 的位置,则 号元素有如下两种选择:
- 放在位置 上,这样剩下的问题变成了
- 不放在位置 上,这样剩下的问题变成了
再考虑到 有 种取值,则
P4071 [SDOI2016]排列计数
个元素的错排问题,再乘上 即可
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探