特殊数列(长期项目)
前排提醒: LATEX 可能过多,请耐心等待加载
斐波那契数列(Fibonacci)#
可能不是很特殊,但是确是最为常见的,看名字就知道明显是个叫做斐波那契的人发现的,全名 莱昂纳多·斐波那契(Leonardo Fibonacci)(意大利)。
-
定义: f0=0,f1=1,fn=fn−1+fn−2(n≥2)
生成函数 F(x)=11−x−x2
-
通项公式: fn=1√5[(1+√52)n−(1−√52)n],推导方式有很多种,这里使用
最简单的两种-
特征方程法:(都是自己盲猜的,有误请指正)
数列中特征方程法本质上就是构造等比数列,只不过完全看不出来(瞎猜)
fn=fn−1+fn−2⟺fn−fn−1−fn−2=0可以看出 fn、fn−1、fn−2 形式一样,我们设其为 fn=aqn,则
aqn+2−aqn+1−aqn=0⟺aqn(q2−q−1)=0⟺aqn(q−1+√52)(q−1+√52)=0有 f1,n=a(1+√52)n,f2,n=a(1−√52)n将特解线性组合得通解 fn=Af1,n+Bf2,n将 f0=0,f1=1 代入:
{Aa+Ba=0(1)Aa(1+√52)+Ba(1−√52)=1(2)解(1): a(A+B)=0∵a≠0(等比数列性质)∴A+B=0⟺B=−A代入(2):Aa(1+√52−1−√52)=√5Aa=1⟺Aa=1√5再将两个结论代入原数列:
fn= Aa(1+√52)n+Ba(1−√52)n= Aa[(1+√52)n−(1−√52)n]= 1√5[(1+√52)n−(1−√52)n] -
生成函数法:
fn的普通型生成函数为 F(x),则 F(x)=x+x2+2x3+3x4+5x5+...+fnxn+...
利用无穷项的特性,显然有 F−Fx=Fx2+x⟺F=x1−x−x2
然后因式分解、裂项:
F(x)=x1−x−x2=x(1−ϕ1x)(1−ϕ2x),解得ϕ1=1+√52,ϕ2=1−√52=x(a1−ϕ1x+b1−ϕ2x)=x(a+b−x(aϕ2+bϕ1)(1−ϕ1x)(1−ϕ2x))⟺{a+b=1aϕ2+bϕ1=0,解得{a=5+√510=1√5⋅√5+12b=5−√510=1√5⋅√5−12⟺F(x)=ax11−ϕ1x+bx11−ϕ2x=ax(1+ϕ1x+ϕ21x2+...+ϕn1xn+...)+bx(1+ϕ2x+ϕ22x2+...+ϕn2xn+...)=1√5(1+√52x+(1+√52)2x2+...+(1+√52)nxn+...)−1√5(1−√52x+(1−√52)2x2+...+(1−√52)nxn+...)据此,我们很容易看出 fn=1√5[(1+√52)n−(1−√52)n]
-
-
一些性质:
-
与黄金分割比的关系:
limn→∞fn−1fn=√5−12Proof:
fn=fn−1+fn−2⟺fnfn−1=1+fn−2fn−1,设极限 limn→∞fnfn−1存在且为 x。
则 limn→∞fn−2fn−1=limn→∞fn−1fn=1x,故:
x=1+1x(x>1)解得 x=1+√52⟺limn→∞fn−1fn=1x=√5−12
-
- 平方项与前后项(勾股特征):f2n−fn−1fn+1=(−1)n−1⟺|f2n−fn−1fn+1|=1(定值)
- 平方项与前后项(勾股特征):
-
- 求和:
- 两倍项关系:
-
隔项关系:
f2n−2m−2(f2n+f2n+2)=f2m+2+f4n−2m, (n>m≥−1,n≥1)-
将杨辉三角左对齐,所有斜率为 1 的直线上数的和为 f 的某一项
fn=m∑i=0(n−1−ii)其中 m 为同一直线上数的个数。
事实上这个结论是那样的显然,以至于写出来有点累赘了 -
m|n⟹fm|fnf(n,m)=(fn,fm)
-
-
因为我觉得这个线看起来很和谐,所以就搬上来了/xyx:
该图很好地证明了平方项求和的结论:∑ni=0f2i=fnfn+1
-
生成函数: 没啥好说的,普通生成函数 F(x)=x1−x−x2=x+x2+2x3+3x4+...+f∞x∞
-
矩阵递推: [fnfn+1]=[fn−1fn]×[0111] ,可以快速得求出第 n 项。
-
推广:
-
斐波那契-卢卡斯数列:
卢卡斯数列: 1, 3, 4, 7, 11, 18..., (斐波那契—卢卡斯递推:an=an−1+an−2(n≥2)),简而言之,初值 a0、a1不同。
以 a、b 为前两项的、满足斐波那契—卢卡斯递推的数列 F(a,b) 就是斐波那契-卢卡斯数列。其所有数列都满足勾股特征( |f2n−fn−1fn+1| 为定值),但不一定满足 |f2n−fn−1fn+1|=1(自然特征)
-
广义斐波那契数列:
递推式诸如 fn=pfn−1+qfn−2 的数列称为广义斐波那契数列。
啊这我怎么感觉好多好多常见数列都是广义斐波那契数列(自然数、等差、等比……)
-
错位排列#
-
定义: 最早起源于信封问题,现在可以看成:满足任意 ai≠i 的排列数(瞎扯)
这显然只与 n 有关,设 dn 为 n 个数字错位排列的方案数,则有:
其意义为:n 个数的全排列为 1~n 位全错位排列重新排列(i 个全错位重新分配到 n 个数中)的方案数之和。
容易发现 (ni)di 为 n-i 位不错排,i 位为错排的方案数,求和即为全排列。
-
推导公式及化简:
-
将 (1) 式二项式反演,有通项公式:
dn=n∑i=0(−1)i(ni)(n−i)!=n∑i=0(−1)in!(n−i)!i!(n−i)!=n!n∑i=0(−1)ii!这个结论同样可以暴力容斥得到,但其实二项式反演的本质即容斥:
dn=∑S∈[n](−1)|S|(n−|S|)!同样可以推出上面的通项公式。
这对于手算来说还是太繁琐了,有更简便的计算吗?
注意到 ex 的 Taylor 展开式为 ∞∑i=0xii!,当代入 x=−1 时,有 e−1=∞∑i=0(−1)ii!,与我们获得的通项公式中的某一项十分相似。
当 n 很大的时候,可以近似得认为e−1=n∑i=0(−1)ii! ,代入通项公式得近似公式:
dn≈n!e经过误差考量我们发现,误差最大时将其值四舍五入即可得到正确答案,而误差随 n→∞ 而逐渐减小,故有更简便的计算公式:
dn=⌊n!e+12⌋而这同时也说明了在 n 越来越大的时候,全排列数与错排数的比值趋近自然底数 e,真是美妙。
-
递推公式:
dn=(n−1)(dn−1+dn−2)感性理解,放入第 n 个数字时:
-
如果前面 n - 1 个数已是全错位排列,随便与一个数交换,也能得到一个错位排列。
-
如果存在某个数不是错排(n - 2 位全错排),则必须与之交换,否则无法构成全错位。
这式子与前两项都有关,我们尝试化简:
dn=(n−1)dn−1+(n−1)dn−2⟺dn−ndn−1=−(dn−1−(n−1)dn−2)设 cn=dn−ndn−1, 则 c2=d2=1,易得 cn=1×(−1)n−2=(−1)n
得递推公式:dn=ndn−1+(−1)n -
-
-
生成函数: 指数型生成函数 ^D(x)=1ex(1−x)
之前已经讨论过 Bell数列生成函数的推导 ,但在 H 队博客里还提到了这么一个结论:
因此,我们可以归纳出 exp 函数在生成函数运算上的组合意义:设有标号组合对象 A 的指数型生成函数为 ^A(x),表 [xn]^A(x)×n! 示组合 n 个元素的方案数,那么 ^B(x)=e^A(x) 就是把元素划分为若干无标号不交并,每一个子集内当作组合对象 A 来处理,所对应的 EGF(指数型生成函数).
错位排列一定是由一些大小不为 1 的置换环组合而来,比如 2 3 4 5 6 1 是一个大小为 6 的置换环,而 2 3 1 5 6 4 则是两个大小为 3 的置换环组合来的。错排的定义正好吻合:不存在大小为 1 的置换环。
每个置换环可以看作单独的一个对象 A,而 ^A(x) 即为环排列的生成函数 ˆG−x=ln11−x−x(减去大小为 1 的置换环)
则错位排列的生成函数即为:
^D(x)=e^A(x)=eln11−x−x=1(1−x)ex泰勒展开验算:
1+x22!+2x33!+9x44!+44x55!+...系数就是错排数。
-
拓展应用:
- 上面那个容斥的通项计算可以推广到一些特殊形式:m 个点已经给定的错排数,或 n-k 错排(理论)
我们考虑给定了 m 个点的错排数,需要我们填的只有 n-m 个空,类似于之前容斥:
ans=n−m∑i=0(−1)i(n−mi)(n−m−i)!-
- 对于 n 个数中选 m 个构成错排的方案数,一种比较直观的方法是算出所有存在非错排的方案数:
ans=m∑i=max(2m−n,0)(mi)(n−im−i)∑0≤j≤i(−1)j(ij)(m−j)!其含义为选出的 m 个数字中有 i 个在 [1,m] 的范围内,那么选出 i 个可能在自己位置上,方案数 (mi) ;其余有 m−i 个位置,随便在剩下的 n−i 个数字中选即可,方案数 (n−im−i) 接下来考虑这每一种构成非错排的不重不漏的方案数,套用错排计算通项即可。
- 对于只有一重和式的做法,可以考虑这么一种构造:一个 n 的任意排列,选前 m 个有效位,构成错排的方案数;除去 n!,也就是所有方案数。除去每次重复的 (n−m)! 就可以计算出总方案数。m∑i=1(−1)i−1(mi)(n−i−m)!
在前 m 位中选 i 个位错排,剩下全随便选,容斥一下可得方案数。
卡特兰数(Catalan number)#
-
定义:是组合数学中一个常出现于各种计数问题中的数列。百度百科上就是这么定义的。
前几项(0开始):1,1,2,5,14,42,132,429,1430,4862,16796...,
其中第 i 项记为ci。
我们主要研究卡特兰数的诸多实际应用,如合法出栈序列、合法括号匹配、多边形划分、二叉树形态等。
-
生成函数: 指数型生成函数 C(x)=1−√1−4x2x
Proof:
C(x)=∞∑i=0cnxi,C2(x)=∞∑i=0(n∑j=0cjci−j)xi=∞∑i=0ci+1xi⟺C(x)=1+xC2(x)解得
C(x)=1±√1−4x2x显而易见卡特兰数不可能有两个生成函数,考虑取舍。
我们将 √1−4x 暴力 Maclaurin(麦克劳林) 展开:
√1−4x=1−2x−2x2−4x3−10x4...分别代入两个生成函数:
C1(x)=1+1−2x−2x2−4x3−10x4...2x=x−1−1−x−2x2−5x3...C2(x)=1−1+2x+2x2+4x3+10x42x=1+x+2x+5x3...恭喜你推出了卡特兰数第 -1 项显然 C2 才是正确的生成函数。 -
计算公式:
递归/递推公式:
cn={1n=0∑0≤i≤n−1cicn−i−1n≥1cn=4n−2n+1cn−1该式在实际应用中有很多具体意义,见下面的“应用”。
通项公式:
cn=(2nn)n+1=(2nn)−(2nn−1)推导:
将 √1−4x 泰勒展开(或广义二项式展开)得到√1−4x=[xn](−4)n(12n),进而得到:
带进生成函数:
所以可得 cn=(2ii)i+1
-
应用:
-
多边形对角线
Conclusion: 对于一个凸 n 边形,将其分割为若干三角形的方案数为 cn−2.
Proof: 对于某个点可以与 n-2 个点连线将多边形分成一个 a+1 边形和一个 n-a+1 边形,递归处理。
根据卡特兰数的定义,即可证明方案数为 cn−2。
-
n 次进栈,n 次出栈的合法排列数
Conclution: 为卡特兰数第 n 项。
Proof: 通过合法方案减去不合法方案得到答案为 (2nn)−(2nn−1),发现即为卡特兰数通项公式 (2nn)n+1=(2nn)(1−nn+1)=(2nn)−(2nn−1),故得证。
-
(0,0)→(n,n)不越过 y=x 的路径数
Conclusion: 方案数为 cn
Proof: 略
-
n 对括号完全匹配
Conclusion: 如题,n 对括号合法匹配数,合法的定义无需解释。
Proof: 可以令左括号为 1,右括号为 -1,则合法方案数为前缀和不为负的排列方案数。
那么可以理解为 1 是往右,-1 是往上,则合法方案数为不越过 y=x 的路径数,即上一个应用。
-
n 个节点的二叉树形态数
Conclusion: 不说了都是卡特兰数。
Proof: 取出一个作为根的点,就可以递归解决,最后列出和 Catalan 数定义一样的递归式。
-
{1,2...2n}两两分为 n 个子集,其中元素不交叉的方案数
-
排队找零问题
And So On……
-
-
推广:(ExCatalan)
可以通过格路径引出这个问题。
-
(0,0)→(n,n)不越过 y=x+k 的路径数: (2nn)−(2nn−k−1)
-
n 对括号最多失配 k 对的方案数: (2nn)−(2nn−k−1)
恰好 k 对的方案数: (2nn−k)−(2nn−k−1)
容易发现,(2nn−m) 的含义即为最少完配 n-m 次错误的方案数。
-
References:#
[1] hxc.(2004).Fake with its applications,『特殊计数数列』,『组合数学总结2:生成函数和特殊计数数列』
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· PPT革命!DeepSeek+Kimi=N小时工作5分钟完成?
· What?废柴, 还在本地部署DeepSeek吗?Are you kidding?
· DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地
· 程序员转型AI:行业分析