组合数
Ckn=n!k!∗(n−k)!
Ckn=Ckn−1+Ck−1n−1
Ck+1n=n−kk+1Ckn
错排数
n
个数进行排列,每个数都不在自己的位置上的方案数
推导:
对于第
n
个数,不放在
第
n
个数放定后,假设放在
1. 放在
2. 不放在
n
位置上,则剩下
将第
k
个数的原本位置当做
所以
Dn=(n−1)∗(Dn−1+Dn−2)
其中
D0=1
,
D1=0
隔板法
1) 将
n
个小球,放入
Ck−1n−1
将
n
个小球排成一行,中间插入
故从
n−1
个位置中选择 k-1个,方案数为
Ck−1n−1
2) 将
n
个小球,放入
Ck−1n+k−1
与上种情况基本相同,但允许盒子为空,所以人为在每个盒子里先加一个球
这样问题就转化为上种情况,计算出方案后,再把加的球拿掉,方案数不变
这样就有
n+k
个球,从
n+k−1
个位置中选择
k−1
个隔板
可重复排列
n
个不相同的球,从中取
Cn−1n+k−1
可以看作是
n
个盒子,放入
用隔板法求解
C(n,k) mod p (lucas定理)
C(n,k)%p=C(n%p,k%p)×C(n/p,k/p)
虽说当
p
为质数时,组合数可以利用逆元
但是当
n
和
这样一来因为只需求
C(n%p,k%p)
,所以只需预处理到模数
p
的阶乘即可。
其时间效率为
网格不相交路径计数 (Lindström–Gessel–Viennot引理)
设有向无环的网格中,起点集为
设
f(u,v)
为
u
到
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 的奇偶性与逆序数的奇偶性一致
那么这样一来,可以将容斥的求和过程转化为一个行列式
容斥的计算复杂度为