总结了一些组合推式子的技巧
前置知识
式子推导的一个目的就是获取表达式的封闭形式或是更加易于运算的形式。
封闭形式:可以通过有限次的初等运算计算得到结果的表达式。
这里的初等运算是指如 +−×÷logansinn! 等常见运算。微分,积分,极限不属于初等运算。
大概有个概念就行了,不必过分执着于细节上的定义。
组合数的括号记法:(nk) 表示从 n 个数中选出 k 个数的方案数。有时候也会用 (nk,n−k) 这样的记法。其中的数都在阶乘意义下,相当于 n!k!(n−k)! 和 (nk) 。
二项式系数:形如 (nk) 的数被称为二项式系数。
文章中所用到的一些记号:
参考资料:
正文
二项式系数的定义:
(nk) 其中 k∈N,n≥k,对于不满足上述条件的不合法情况,均将其值视为 0。
给出几个基本的组合恒等式,它们是式子推导的基石:
Identity 1.1:(nk)=(nn−k)(对称变换)
Identity 1.2:(nk)=(n−1k−1)+(n−1k) (递推公式)
Identity 1.3:(nm)(mk)=(nk)(n−km−k)(三项恒等式)
以上均可以用组合意义记忆。
Identity 1.4:(nk)=nk(n−1k−1)(吸收 / 释放公式)
这个公式可以吸收组合数前的讨厌的系数,后面会有具体的例子。
上面是一些基础恒等式,但是在式子推导中起到了巨大的作用。
在实际应用中,需要化简的式子往往以和式 ∑ 的形式出现,于是化简的时候必然会用到一些和式相关的组合恒等式。
和式相关的组合恒等式:
Identity 1.5:(x+y)n=∑k(nk)xkyn−k(二项式定理)
Identity 1.6:n∑k=0(nk)=2n(下指标求和)
Identity 1.7:n∑k=0(km)=(n+1m+1)(上指标求和)
Identity 1.8:n∑k=0(m+kk)=(n+m+1n)(平行求和)
Identity 1.9:∑k(rn−k)(sm+k)=(r+sn+m)(范德蒙德卷积)
以上 5 个式子每一个都有非常好的组合意义来解释。
-
每个括号内都有两个颜色的球(红,蓝)可以选,选出 k 个球(xk)的方案数有 (nk) 个。
-
每个数都有选或不选两种可能。
-
从 n+1 个球中选取 m+1 个球,固定选取的最后一个(第 m+1 个)球的位置 k+1,在前 k 个中选取 m 个球的方案数相加。
-
类比于 3 来记忆。
-
有两个盒子,一个盒子中有 r 个球,另一个中有 s 个球,一共从中选择 n+m 个球,总共的方案数就是枚举盒子 1 中选 n−k 个球,盒子 2 中选 m+k 个球。
弄清楚它们能解决哪些问题是很有必要的:比如范德蒙德卷积是唯一包含两个二项式系数的式子,真正应用的时候,求解包含两个二项式系数的和式大部都与范德蒙德卷积有关。
以上都可以被称为基础中的基础。
广义二项式系数
前文的二项式系数都被限定在了正整数范围内,这十分不利于式子的推导。
对于形如 (nk) 的二项式系数,其中 n 可以被扩展到实数域上。
定义 (nk)=n(n−1)(n−2)…(n−k+1)k!,n∈R,k∈N 。不难发现,n 为正整数的时候与普通二项式系数并无二至。
有了广义二项式系数这个有力工具,终于真正意义上可以开始我们的组合推导正文了。
开始之前,再介绍一个公式:
Identity 1.10:(nk)=(−1)k(k−n−1k)(上指标反转)
要证明的话,我也不会什么优美的办法,暴力展开吧。
一个比较优美的事实是上指标反转两次后,你就可以得到原式。
一些求解的技巧
和式求解的基本技巧:
分离系数:∑ic×ai=c×∑iai
和式拆解:∑ibi+ai=∑iai+∑ibi
指标变换:∑i[0≤i≤n]ai=∑i[0≤i≤n]an−i。
对于技巧三,乘法或是其它运算也有类似操作。
多重和式 ∑∑,有交换求和顺序的技巧:
常见的方法是 n∑i=0i∑j=0→n∑j=0n∑i=j ,它的使用是基于将较为困难的内层和式进行转化求解。
例 1(二元和式的求解):
求出 ∑−q≤k≤l(l−kr)(q+ks) 的简单封闭形式。
l,q,r,s∈Z,l+q≥0,r≥0,s≥0
LHS=∑−q≤k≤l(l−kl−k−r)(q+kq+k−s)=∑−q≤k≤l(−1)l−k−r(−1)q+k−s(−r−1l−k−r)(−s−1q+k−s)=(−1)l+q−r−s∑−q≤k≤l(−r−1l−k−r)(−s−1q+k−s)=(−1)l+q−r−s(−r−s−2l+q−r−s)=(l+q+1l+q−r−s)=(l+q+1r+s+1)Q.E.D.
例 2(二项式系数商的一种处理方式):求出 m∑k=0(mk)/(nk) 的简单封闭形式。
LHS=1(nm)m∑k=0(n−km−k)=1(nm)∑m−k≥0(n−(m−k)m−(m−k))=1(nm)∑k≥0(n−m+kk)=(n+1m)(nm)=n+1n−m+1
例 3(二项式定理的逆向运用):CF660E
给出题意得出的式子:
n∑i=1n∑j=i(j−1i−1)(m−1)j−imn−(j−i)
n∑i=1n∑j=i(j−1i−1)(m−1)j−imn−(j−i)=∑1≤j≤nmn−j∑1≤i≤j(j−1i−1)(m−1)j−imi=∑1≤j+1≤nmn−j−1∑1≤i+1≤j+1(ji)(m−1)j−imi+1=∑0≤j≤n−1mn−j(2m−1)j
例 4(裂项求递推式):
Qn=∑k≤2n(2n−kk)(−1)k,n∈N+
(m=2n)Qn=Rm=∑k≤m(m−kk)(−1)k=∑k≤m(m−1−kk)(−1)k+∑k≤m(m−1−kk−1)(−1)k=∑k≤m−1(m−1−kk)(−1)k+(−1m)(−1)m−∑k+1≤m(m−2−kk)(−1)k=Rm−1+(−1m)(−1)m−∑k≤m−2(m−2−kk)(−1)k−(−1m−1)(−1)m−1=Rm−1−Rm−2+(−1m)(−1)m+(−1m−1)(−1)m−1=Rm−1−Rm−2+(−1)2m+(−1)2(m−1)=Rm−1−Rm−2
对于看起来无法找到封闭形式的和式,可以考虑使用组合数的递推公式进行裂项求解。
小结
是时候该总结一下所遇到的一些问题了:
二项式系数边界问题:
(10),(00),(01) 分别等于几?0!,00 又如何呢?这些问题也许看起来微不足道,但千里之堤溃于蚁穴,我们必须得注意。
- (10)=1,(00)=1,(01)=1
这是因为在二项式系数中,定义 0!=1,代入定义式 (nk)=n!k!(n−k)! 就可以得到答案。
为什么这么说呢 ? 许多人认为 00 没有意义,因为 limx→0x0 和 limx→00x 是两个截然不同的值。然而在二项式系数下,却并非如此。
考虑二项式定理 (x+y)n=n∑k=0(nk)xkyn−k 中 n=0 的情况。我们应当指定 00=1,否则其并不成立。
恒等式的成立条件
这个是非常有必要研究的一个问题,推柿子的过程中,可能因为一些玄学错误而百思不得其解。这个时候就要考虑,你所用恒等式的成立条件了。
举个例子 (nk)=(nn−k) 仅在 n 为非负整数的时候成立,如果你在推导过程中用到了这个公式,一定要注意它的成立条件。
如下列举了上面所提到的所有恒等式的成立条件。
⎧⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪⎨⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪⎩(nk)=(nn−k),n∈N,k∈Z(nk)=(n−1k−1)nk,k∈Z,k≠0(nk)=(n−1k−1)+(n−1k),k∈Z(nk)=(−1)k(k−n−1k),k∈Z(nm)(mk)=(nk)(n−km−k),k,m∈Z∑k(nk)xkyn−k=(x+y)n,n≥0 or∣xy∣<1∑k≤n(m+kk)=(n+m+1n),n∈N∑k≤n(mk)=(m+1n+1),m,n∈N∑k(rk)(sn−k)=(r+sn),n∈Z
在上表中,你可以注意到平行求和法和上指标求和法的差异,二项式定理的精确成立条件。
可以感受到,没有任何成立条件限制的恒等式是最为有用且好用的(整数意义下)。
推导的过程
在推导的过程中难免会遇到一些和式上下界的变动,这时候,将其写为更加一般化的上下界,甚至如果允许不写上下界,更能简化你推导的难度和加快推导速度。
比如,n∑i=0 显然比 n−1∑i=2 能使运算更加简洁,而 ∑i 又是一个更加泛化而简洁的形式。
所以如果条件允许的话,使用更加泛化的形式更有利于你的推导。
下面看一个复杂一点的例子。
例 5:
求出 ∑k≥0(n+km+2k)(2kk)(−1)kk+1 的简单封闭形式。
Lemma 1:(nm)(mk)=(nk)(n−km−k)Lemma 2:∑−q≤k≤l(l−kr)(q+ks)=(l+q+1r+s+1)∑k≥0n+k−1∑i=0(n−i+k+12k)(im−1)(2kk)(−1)kk+1=∑i≥0(im−1)∑0≤k≤i+1−n(n−i+k+12k)(2kk)(−1)kk+1=∑i≥0(im−1)∑0≤k≤i+1−n(n−i+k−1k)(n−i−1k)(−1)kk+1=∑i≥0(im−1)1n−i∑0≤k≤i+1−n(n−i+k−1k)(n−ik+1)(−1)k=∑i≥0(im−1)1n−i∑0≤k≤i+1−n(i−nk)(n−in−i−k−1)=∑i≥0(im−1)1n−i(0n−i−1)=∑i≥0(im−1)1n−i[i=n−1]=(n−1m−1)
递归式与和式的互相转化
对于形如 anTn=bnTn−1+cn 有一般方法将其转化为和式。
两侧分别乘以求和因子 sn,snanTn=snbnTn−1+sncn 。
求和因子应满足 snbn=sn−1an−1 。
设 Sn=snanTn,得到 Sn=Sn−1+sncn
→Sn=s0a0T0+n∑i=1sici
→Tn=1snan(s0a0T0+n∑i=1sici)
如何求出恰当的求和因子 sn 又是一个问题。
对于式子:sn=sn−1an−1bn,展开后可以得到:sn=an−1an−2…a1bnbn−1…b2 。
只要保证 bi 不为 0,就可以得到 sn 的值。
如上提供了一种递归式化和式的通法。
例 6:
求解如下递归式:
T0=52Tn=nTn−1+3×n!
snbn=sn−1an−1→sn=2nsn−1→sn=2nn!sn=an−1an−2…a1bnbn−1…b2=Tn=1snan(a0s0T0+n∑i=1sici)=n!2n+1(10+n∑i=13×2i)=n!2n+1(3×2n+1−4)=3×n!−n!2n−1
12 的处理
考虑如下等式 (r−12)k––rk––=2r2k–––14k
两边同时除以 (k!)2 后可以导出如下公式:
(rk)(r−12k)=(2r2k)(2kk)122kIdentity 2.1:(n−12n)=(2nn)14nIdentity 2.2:(−12n)=(−14)n(2nn)(1)(2)(3)
于是对于形如 (x+y)12 二项式展开后的情形,(2),(3) 给出了一种优美的处理方式。
如上两式还给出了系数如 4−n 的一种处理办法。
比如下面这个例子:
∑k(n2k)(2kk)2−2k=∑k(n2k)(n−12k)=(n−12⌊n2⌋)
还有一个非常优美的恒等式
例 7(加倍公式):∑k(2kk)(2n−2kn−k)
=∑k(−4)k(−12k)(−4)n−k(−12n−k)=(−4)n(−1n)=4n
以上是二项式系数中 12 的处理办法,甚至,你可以将某些难以处理的二项式系数转换为含有 12 的形式进行处理。
例 8(综合考察):CF1278F
给出答案的式子 n∑i=0(ni)pi(1−p)n−iik
考虑化简:
Lemma1:ik=∑j(ij){kj}j!Lemma2:(nm)(mk)=(nk)(n−km−k)
n∑i=0(ni)pi(1−p)n−iik=n∑i=0(ni)pi(1−p)n−i∑j(ij){kj}j!=∑j{kj}j!n∑i=0(ni)(ij)pi(1−p)n−i=∑j{kj}j!n∑i=0(nj)(n−ji−j)pi(1−p)n−i=∑j{kj}(nj)j!n∑i=0(n−ji−j)pi(1−p)n−i=∑j{kj}(nj)j!pjn∑i=0(n−ji−j)pi−j(1−p)n−i=∑j{kj}(nj)j!pj=∑j≤min(k,n){kj}(nj)j!pj
化简到这里,已经可以用 O(k2) 递推做掉这道题了。
还可以继续。
对 Lemma 1 使用二项式反演得到:
i!{ki}=∑j(−1)i−j(ij)jk
继续刚才的推导。
=min(n,k)∑j=0(nj)pjj∑i=0(−1)j−i(ji)ik=min(n,k)∑i=0ikmin(n,k)∑j=i(ji)(nj)(−1)j−ipj=min(n,k)∑i=0ik(−1)i(ni)min(n,k)∑j=i(n−ij−i)(−p)j=min(n,k)∑i=0ik(ni)pimin(n,k)−i∑j=0(n−ij)(−p)j
考虑裂项求后面和式的递推式。
以下是 k≤n 的情况:
Ri=k−i∑j=0(n−ij)(−p)j=k−i∑j=0(n−i−1j)(−p)j+k−i∑j=1(n−i−1j−1)(−p)j=Ri+1+(n−i−1k−i)(−p)k−i+k−i−1∑j=0(n−i−1j)(−p)j+1=Ri+1+(n−i−1k−i)(−p)k−i+(−p)k−i−1∑j=0(n−i−1j)(−p)j=Ri+1−pRi+1+(n−i−1k−i)(−p)k−i
边界是 Rk=1
对于 n<k 的情况:Ri=(1−p)Ri+1,Rn=1
综上所述:
Ans=min(n,k)∑i=0ik(ni)piRi
高阶差分
一阶差分为:Δf(x)=f(x+1)−f(x)
二阶差分为:Δ2f(x)=Δf(x+1)−Δf(x)
n 阶差分为:Δnf(x)=Δn−1f(x+1)−Δn−1f(x)
Theorem 2.1:Δnf(x)=∑k(nk)(−1)n−kf(x+k)
数学归纳法。
Proof:
n=1 的时候该式显然成立。
假设该式在 n=m−1,m≥2,m∈Z 的时候成立。
Δmf(x)=Δm−1f(x+1)−Δm−1f(x)=m−1∑k=0(m−1k)(−1)m−1−kf(x+1+k)−k=m−1∑k=0(m−1k)(−1)m−1−kf(x+k)=m∑k=1(m−1k−1)(−1)m−kf(x+k)+m∑k=1(m−1k)(−1)m−kf(x+k)+(−1)mf(x)=m∑k=1(mk)(−1)m−kf(x+k)+(−1)mf(x)=m∑k=0(mk)(−1)m−kQ.E.D.
该定理很重要,它给出了原函数和差分函数之间的关系,也让我们看到了二项式系数出现的另外一种形式:交错排列的二项式系数。
牛顿级数:
对于一个多项式 f(x)=anxn+an−1xn−1⋯+a1x+a0 。一定可以被表示为 f(x)=cn(xn)+cn−1(xn−1)⋯+c1(x1)+c0(考虑通常幂能转下降幂,下降幂转二项式系数)。
如上 f(x) 的展开式 cn(xn)+cn−1(xn−1)⋯+c1(x1)+c0 就被称为牛顿级数。
设 F(x)=cd(xd)+cd−1(xd−1)⋯+c1(x1)+c0
→ΔnF(x)=cd(xd−n)+cd−1(xd−n−1)+⋯+cx(11−n)+c0(0−n)
考虑 Δ((xd))=(xd−1)(即递推公式)对上式就不会感到奇怪了。
考察 ΔnF(0) 可以发现一个非常有用的事实:ΔnF(0)=cn,∀n∈[0,d]
于是 F(x) 的牛顿级数又可以写作:F(x)=ΔdF(0)(xd)+Δd−1F(0)(xd−1)⋯+ΔF(0)(x1)+F(0)
例如 F(x)=x3 的牛顿级数就为 F(x)=6(x3)+6(x2)+1(x1)+0(x0)
对 ΔnF(0)=cn 应用 Theorem 2.1 可以得到如下式子:
∑k(nk)(−1)n−k(c0(k0)+c1(k1)+c2(k2)+…)=cn
将括号中的式子转化为通常幂的形式后,由于 n!cn=an,于是上式可以化为如下形式:
Theorem 2.3:∑k(nk)(−1)k(a0+a1k+a2k2+…)=n!an(−1)n
例 8:∑k(nk)(r−skn)(−1)k
k 前面的系数 s 看似十分困难,但是观察到 (nk)(−1)k 后,我们不难想到高阶差分。
于是一切就仿佛水到渠成般一样容易:
F(k)=(r−skn)=a0+a1k+a2k2+a3k3…ankn→an=1n!sn(−1)n
根据 Theorem 2.3 得到原式 =n!an(−1)n=sn 。
非常的巧妙。
很神奇的一个事情是最后的答案根本与 r 无关,也许这有些不合常理,但是事实确实如此(正确性测试代码)。
我曾思考了很久,牛顿级数(高阶差分)能应用在哪些地方,多项式的展开?但是牛顿级数能做到的,泰勒展开也能做到。
牛顿级数(高阶差分)主要能在以下地方:
就像上文的例 8 一样,Theory 2.3 能将形如 ∑k(−1)k(nk)G(k) 的式子,转换为求解 G(k) 的 kn 的系数。
牛顿级数将下降幂多项式与离散的点值联系在了一起。
对 F(x)=n∑i=0F[i](xi) 使用二项式反演可以得到:F[i]=n∑i=0(−1)n−i(xi)F(i)
如上给出了离散点值与 F[i] 之间的联系,这是一种全新的插值方式。
二项式反演可以 NTT 加速,则时间复杂度为优秀的 O(nlogn) 。
有了与离散点值之间的联系,容易发现 xi–i!=(xi),简单转换就是下降幂多项式了。
普通多项式转下降幂多项式
我还没写 QAQ,正确性不保证。
文章已至尾声,可是组合数的世界才刚刚展开。
欧拉数,调和级数,q−analog,超几何函数 … 。它们不是偏僻的名词,它们潜藏于每一个角落。
组合数学的天地广阔无穷,等待你去探索。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】