组合数学学习笔记

定义

Cnm=(nm)=n!m!(nm)!

公式

(nk)=(n1k)+(n1k1)

i=0n(ni)=2n

(nm)(mk)=(nk)(nkmk)

组合数求法

  • 当范围较小时,使用加法原理 O(n2) 求组合数(杨辉三角)

  • 当范围较大时用定义式,对大质数 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(logpn)

Lucas 定理

(nm)(npmp)×(nmodpmmodp)(modp)

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) 球相同 盒不同 无空盒

隔板法,相当于在 n1 个位置插 m1 个隔板,答案为 (n1m1)

2) 球相同 盒不同 有空盒

加入 m 个“虚球”,接下来同无空盒,最终答案为 (n+m1m1)

3) 球不同 盒相同 无空盒

第二类斯特林数。

fi,ji 个小球放在 j 个盒子里且每个盒子不空的方案数,则 fi,1=fi,i=1,转移为 fi,j=j×fi1,j+fi1,j1

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),统计答案为 i=1mfn,i×Ami

7) 球相同 盒相同 无空盒

基本同 8)

8) 球相同 盒相同 有空盒

fi,ji 个小球放在 j 个盒子里的方案数,则 fi,j=fi1,j1+fij,j。(第 j 个盒子放不放第 i 个球的两种情况)

答案为 i=1mfn,i

例题

P1595 信封问题

错排问题裸题。

Dn 表示 n 个元素的错排个数,我们来分析一下递推过程:

假设现在放了 n1 个元素,第 n 个元素假设放在了 k 的位置,则 k 号元素有如下两种选择:

  1. 放在位置 n 上,这样剩下的问题变成了 Dn2
  2. 不放在位置 n 上,这样剩下的问题变成了 Dn1

再考虑到 kn1 种取值,则 Dn=(n1)×(Dn1+Dn2)

P4071 [SDOI2016]排列计数

nm 个元素的错排问题,再乘上 (nm) 即可

posted @   8ovehat1r  阅读(47)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探
点击右上角即可分享
微信分享提示