组合计数笔记

组合数

Ckn=n!k!(nk)!
Ckn=Ckn1+Ck1n1
Ck+1n=nkk+1Ckn


错排数

n 个数进行排列,每个数都不在自己的位置上的方案数
Dn=(n1)(Dn1+Dn2)

推导:
对于第 n 个数,不放在 n位置,一共有 (n1) 种情况
n 个数放定后,假设放在 k上,考虑第 k 个数
1. 放在 n位置上,则剩下 n2 个数,错排数 Dn2
2. 不放在 n 位置上,则剩下 n1个数
将第 k 个数的原本位置当做 n(不放在 n 位置上),错排数 Dn1
所以 Dn=(n1)(Dn1+Dn2)
其中 D0=1 D1=0


隔板法

1) 将 n 个小球,放入 k个盒子里,每个盒子不为空,求方案数
Ck1n1

n 个小球排成一行,中间插入 k1个隔板,隔板插入的位置有 n1
故从 n1 个位置中选择 k-1个,方案数为 Ck1n1

2) 将 n 个小球,放入 k个盒子里,允许盒子为空,求方案数
Ck1n+k1

与上种情况基本相同,但允许盒子为空,所以人为在每个盒子里先加一个球
这样问题就转化为上种情况,计算出方案后,再把加的球拿掉,方案数不变
这样就有 n+k 个球,从 n+k1 个位置中选择 k1 个隔板


可重复排列

n 个不相同的球,从中取 k个,可以重复取,问方案数
Cn1n+k1

可以看作是 n 个盒子,放入 k个球,一个盒子里的球数代表这个数被取了多少次
用隔板法求解


C(n,k) mod p (lucas定理)

C(n,k)%p=C(n%p,k%p)×C(n/p,k/p)

虽说当 p 为质数时,组合数可以利用逆元 (1)求得
但是当 n k很大的时候,阶乘逆元可能处理不了那么多,所以就要利用 lucas定理。
这样一来因为只需求 C(n%p,k%p) ,所以只需预处理到模数 p 的阶乘即可。
其时间效率为 O(log(n)) log 的底为模数 p


网格不相交路径计数 (Lindström–Gessel–Viennot引理)

设有向无环的网格中,起点集为 U(u1,u2,...,un),终点集为 V(v1,v2,...,vn)
f(u,v) u v的路径方案数,则起点集 U 到起点集 V的不相交路径数为
det(M)=f(u1,v1)f(u2,v1)f(un,v1)f(u1,v2)f(u2,v2)f(un,v2)f(u1,vn)f(u2,vn)f(un,vn)
这个行列式的值
具体证明方法好像是用容斥定理
一个不严谨的证明:

σ(V) 为终点的一个排列, σi 为排列的第 i
如果 i<j ui vj uj vi 的路径就必然产生至少一个交错点
这里有一个至少,所以容斥交点个数来计算总方案数
接下来用容斥定理来计算方案数,易得容斥过程中的某一项为
(1)t(f(u1,σ1)+f(u2,σ2)...+f(un,σn))
接下来就是确定这一项的符号,即 t 的奇偶性
而这与路径的至少有几个交点有关
根据上述,可以发现至少交点个数与σ(V)中的逆序数有关
由于 (ui,vi) 这样顺序对应时(交点个数最少为 0),容斥的符号为正
所以观察发现, t 的奇偶性与逆序数的奇偶性一致
那么这样一来,可以将容斥的求和过程转化为一个行列式

容斥的计算复杂度为 O(n!),而行列式的计算复杂度就降到了 O(n3)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值