排列数
不可重排列 Anr=(n−r)!n!
圆排列 rAnr
+多重集的排列
a1,a2,a3,...,an 互不相同,每个元素有无穷多个,则从中取 r 个形成排列的方案数为 nr
a1,a2,a3,...,an 互不相同,每个元素的个数都大于等于 r ,则从中取 r 个形成排列的方案数为 nr
a1,a2,a3,...,an 互不相同,每个元素的个数都比 r 小。设 k1,k2,k3,...,kn 为 a1,a2,a3,...,an 的个数,则从中取 r 个形成排列的方案数为 k1!k2!k3!...kn!(k1+k2+K3+...+kn)!
a1,a2,a3,...,an 互不相同,至少有一个元素的个数比 r 小。设 k1,k2,k3,...,kn 为 a1,a2,a3,...,an 的个数,则从中取 r 个形成排列的方案数为 r×k1!k2!...kn!r!
组合数
不可重组合 Cnr=r!(n−r)!n!
不相邻组合 Cn−r+1r
+多重集的组合
a1,a2,a3,...,an 互不相同,每个元素有无穷多个,则从中取 r 个的方案数为 Cn+r−1r
a1,a2,a3,...,an 互不相同,每个元素的个数都大于等于 r ,则从中取 r 个的方案数为 Cn+r−1r
+常用公式
Cnr=Cnn−r
帕斯卡恒等式 Cnr=Cn−1r+Cn−1r−1
二项式定理 (x+y)n=∑i=0nCnixn−iyi
∑i=0nCni=2n
Cn0+Cn2+Cn4+Cn6...=Cn1+Cn3+Cn5+Cn7...
∑i=0n2iCni=3n
Lucas定理推论 Cnr 为奇数,则
错排
n 个元素的错排方案数记为 Dn
则有 D1=0,D2=1
Dn=(n−1)(Dn−1+Dn−2)
斐波那契数列
F1=F2=1
Fn=Fn−1+Fn−2
卡特兰数
组合数 Catn=C2nn−C2nn−1
递推 Catn+1=n+22(2n+1)Catn
+应用
-
n 个数有 Catn 种出栈顺序
-
n 个节点的二叉树有 Catn 种构型
-
n+1 个节点的满二叉树有 Catn 种
-
在 n×n 的格子的右下三角形中行走,每次横走或竖走,有 Catn 种走法
-
将 n+2 边形剖分成三角形,有 Catn 种方案
-
有 n 个左括号和右括号的合法括号表达式有 Catn 种
第一类斯特林数
S1[n][m] 表示把 n 个不同的元素排列成 m 个圆排列的方案数
有 S1[n][m]=S1[n−1][m]×(n−1)+S1[n−1][m−1]
边界 S1[0][0]=1
第二类斯特林数
S2[n][m] 表示把 n 个不同的小球放到 m 个相同盒子,且每个盒子不为空的方案数
有 S2[n][m]=S2[n−1][m]×m+S2[n−1][m−1]
边界 S2[0][1]=1
贝尔数
Bn 表示把 n 个不同元素划分为若干个非空集合的方案数
递推公式 Bn+1=∑i=0nCniBi
借助第二类斯特林数 Bn=∑i=0nS2[n][i]
盒子与球模型
n 个盒子,r 个球
球不同盒不同有空盒
每个球之间相互独立,自行选择在哪一个盒子
方案数为 nr
球相同盒不同
每个球相同,用隔板法
没有空盒
方案数为 Cr−1n−1
有空盒
提前向每个盒子中放入一个球,再做没有空盒的情况
方案数为 Cr+n−1n−1
球相同盒相同
考虑dp
有空盒
dp[r][n] 表示将 r 个小球放到 n 个盒子中,允许空盒的方案数
边界 dp[0][...]=1,dp[...][1]=1
转移,对于 dp[i][j]
如果 i<j,dp[i][j]=dp[i][i];
如果 i>=j,dp[i][j]=dp[i−j][j]+dp[i][j−1]
没有空盒
先在每个盒子里都放上一个球
方案数为 dp[r−n][n]
球不同盒相同
考虑第二类斯特林数
没有空盒
方案数为 S2[r][n]
有空盒
枚举有几个盒子为空
方案数为 ∑i=1nS2[r][n−i]
球不同盒不同没空盒
在盒相同的基础上对盒做一个全排列
方案数为 n!×S2[r][n]
组合数取模
m,n≤1000 使用帕斯卡恒等式递推
mod 较大时,使用线性推阶乘逆元
mod 比较小时,使用Lucas定理
Lucas定理
需要借助线性推阶乘逆元
inline int c(int n,int m,int mod){return m>n? 0:fac[n]*inv[m]%mod*inv[n-m]%mod;}
注意lucas的边界
int lucas(int n,int m,int p){return m? c(n%p,m%p,p)*lucas(n/p,m/p,p):1;}