【1】组合数学基础#
我们用 (nm) 代表组合数,其含义为从 n 个物体中选出 m 个的方案数,也可以记为 Cmn。
记 n 的阶乘为 n∏i=1i,记为 n!。
记 n 的 m 次下降幂为 m−1∏i=0(n−i)=n!(n−m)!,记为 nm––。
1.1 基本恒等式#
从 n 个物品中选出 m 个,第 i 次有 n−i+1 种选法,因此总共有 nm–– 中选法,但是因为取出的顺序被多算了,所以要除掉 m!,因此我们可以得到组合数的 **定义式 **:
(nm)=nm––m!=n!m!(n−m)!
预处理阶乘和阶乘的逆元即可做到 Θ(n)−Θ(1),不过因为需要逆元存在因此通常要求模数是大质数。
这一公式也说明了二项式系数的对称性,即 (nm)=(nn−m)。
同时当 n 很大,m 不大时,我们可以 Θ(m) 求出 (nm)。
从另一种角度考虑,我们分第 n 个物品选或者不选,可以得到 加法公式:
(nm)=(n−1m−1)+(n−1m)
通过这个式子我们可以做到 Θ(n2)−Θ(1),不对模数有要求。
我们来看加法公式的一些重要应用:
上指标求和#
n∑i=0(im)=(n+1m+1)
证明:
(n+1m+1)=(nm)+(nm+1)=(nm)+(n−1m)+(n−1m+1)=……#
不断对最后一项展开即可。
平行求和#
n∑i=0(m+ii)=(n+m+1n)
只需要利用对称性,然后通过上指标求和即可。
给出 l1,r1,l2,r2,请求出下式的值:
r1∑i=l1r2∑j=l2(i+ji)
应用两次上指标求和即可。
另一个重要的式子是 吸收恒等式:
(nm)=nm(n−1m−1)
证明很简单,按照阶乘的定义拆开即可。
移项可以得到一个更加常用的形式:
m(nm)=n(n−1m−1)
我们来看这种公式有什么应用:
求下式的值:
n∑i=0i(m−i−1m−n−1)
我们用 m−(m−i) 替换 i,然后得到:
n∑i=0(m−(m−i))(m−i−1m−n−1)=n∑i=0m(m−i−1m−n−1)−n∑i=0(m−i)(m−i−1m−n−1)
然后对于后式使用吸收恒等式,变成
n∑i=0m(m−i−1m−n−1)−n∑i=0(m−n)(m−im−n)=mn∑i=0(m−i−1m−n−1)−(m−n)n∑i=0(m−im−n)
此时变成上指标求和的形式,化简完可以得到:
nm−n+1(mm−n)#
多重集组合数#
(nx1)(n−x1x2)⋯(n−x1−x2……−xk−1xk)=n!x1!x2!⋯xk!
最后我们来看两个最为重要的恒等式:
二项式定理#
(a+b)n=n∑i=0(ni)aibn−i
证明只需要考虑从每个单项式里选择 a 或者 b 就行。
带入一些 a,b 的特例可以得到如下三个式子:
0n=n∑i=0(ni)(−1)i
组合数行内交错和。
2n=n∑i=0(ni)
子集个数。
3n=n∑i=0(ni)2i
子集枚举的复杂度。
范德蒙德恒等式#
n∑i=0(ni)(mk−i)=(n+mk)
这里的证明则需要考虑另一种常见的方式,组合意义。
这些就是就是常见的组合恒等式。
q 次询问,每次给出 n,l,r,求出下式的值:
r∑i=l(ni)
1≤n,l,r,q≤105。
1.2 常见的组合意义#
- 把 n 个相同的小球分到 m 个不同的盒子里,且所有盒子非空。
插板法的经典应用,可以理解成在 n−1 个空隙中插入 m−1 个隔板,所以方案数为 (n−1m−1)。
- 把 n 个相同的小球分到 m 个不同的盒子里,且盒子可以为空。
等价于右面方程的非负整数解的数量 x1+x2+⋯+xm=n。
令 yi=xi+1,那么 y1+y2+⋯ym=n+m,因为 x,y 一一对应,所以 x 的数量就是 y 的数量,而后者显然等于 (n+m−1m−1)。
1.3 Lucas 定理#
对于质数 p,有:
(nm)≡(n/pm/p)(nmodpmmodp)(modp)
预处理 n,m<p 时的阶乘和逆元,可以在 Θ(p)−Θ(log2(n)) 内求组合数。
设 F(n,k)=k∑i=0(ni)
F(n,k)=k∑i=0(nmodpimodp)(n/pi/p)
=p−1∑i=0(nmodpi)k/p−1∑j=0(n/pj)+kmodp∑i=0(nmodpi)(n/pk/p)
=F(nmodp,p−1)F(n/p,k/p−1)+F(nmodp,kmodp)(n/pk/p)
Θ(p2) 预处理,组合数直接 Lucas 求,复杂度 Θ(p2+Tlog2pn)。
这个形式更加通俗的解释是:把 n,m 写成 p 进制,那么组合数就是每一位的组合数的乘积。
而这个解释通常可以把 Lucas 定理和 数位DP 联系在一起。
因为答案等于每一位下 (ikjk) 的乘积,所以只要存在有一位 k,满足 ik<jk,那么 (ij)≡0(modp)。
考虑数位 DP,设 fk,0/1,0/1,0/1,0/1 表示当前到第 k 位,是否出现 ik<jk 的位,ik,jk 是否卡上界,i 是否等于 j。
而当 p=2 时,我们可以得到一个常用推论:
- 对于 n,m,[n&m=m]≡(nm)(modp)。
题给条件显然等于 abi+1 是 abi 的子集,设 fi 表示结尾的 a=i 的方案数,每次枚举子集转移即可。
1.4 Kummer 定理#
对于 n,m,p,(n+mn) 中 p 的个数等于 n+m 在 p 进制下的进位次数。
这个定理同样和数位DP关系密切。
根据 Kummer 定理,我们只需要保证进位次数 ≥α 即可。
数位DP,设 fi,j,0/1,0/1,0/1 表示当前第 i 位,总进位次数为 j ,是否卡上界,以及是否向当前位进位。
复杂度 Θ(log2pA)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)