Processing math: 100%

特殊数列(长期项目)

前排提醒: LATEX 可能过多,请耐心等待加载

斐波那契数列(Fibonacci)#

可能不是很特殊,但是确是最为常见的,看名字就知道明显是个叫做斐波那契的人发现的,全名 莱昂纳多·斐波那契(Leonardo Fibonacci)(意大利)。

  • 定义: f0=0,f1=1,fn=fn1+fn2(n2)

    生成函数 F(x)=11xx2

  • 通项公式: fn=15[(1+52)n(152)n],推导方式有很多种,这里使用最简单的两种

    • 特征方程法:(都是自己盲猜的,有误请指正)

      数列中特征方程法本质上就是构造等比数列,只不过完全看不出来(瞎猜)

      fn=fn1+fn2fnfn1fn2=0

      可以看出 fnfn1fn2 形式一样,我们设其为 fn=aqn,则

      aqn+2aqn+1aqn=0aqn(q2q1)=0aqn(q1+52)(q1+52)=0 f1,n=a(1+52)n,f2,n=a(152)n线 fn=Af1,n+Bf2,n

      f0=0,f1=1 代入:

      {Aa+Ba=0(1)Aa(1+52)+Ba(152)=1(2)(1): a(A+B)=0a0A+B=0B=A(2):Aa(1+52152)=5Aa=1Aa=15

      再将两个结论代入原数列:

      fn= Aa(1+52)n+Ba(152)n= Aa[(1+52)n(152)n]= 15[(1+52)n(152)n]

    • 生成函数法:

      fn的普通型生成函数为 F(x),则 F(x)=x+x2+2x3+3x4+5x5+...+fnxn+...

      利用无穷项的特性,显然有 FFx=Fx2+xF=x1xx2

      然后因式分解、裂项:

      F(x)=x1xx2=x(1ϕ1x)(1ϕ2x),ϕ1=1+52,ϕ2=152=x(a1ϕ1x+b1ϕ2x)=x(a+bx(aϕ2+bϕ1)(1ϕ1x)(1ϕ2x)){a+b=1aϕ2+bϕ1=0,{a=5+510=155+12b=5510=15512F(x)=ax11ϕ1x+bx11ϕ2x=ax(1+ϕ1x+ϕ21x2+...+ϕn1xn+...)+bx(1+ϕ2x+ϕ22x2+...+ϕn2xn+...)=15(1+52x+(1+52)2x2+...+(1+52)nxn+...)15(152x+(152)2x2+...+(152)nxn+...)

      据此,我们很容易看出 fn=15[(1+52)n(152)n]

  • 一些性质:

    • 与黄金分割比的关系:

      limnfn1fn=512

      Proof:

      fn=fn1+fn2fnfn1=1+fn2fn1,设极限 limnfnfn1存在且为 x

      limnfn2fn1=limnfn1fn=1x,故:

      x=1+1x(x>1)

      解得 x=1+52limnfn1fn=1x=512

      1. 平方项与前后项(勾股特征):

        f2nfn1fn+1=(1)n1|f2nfn1fn+1|=1

  1. 求和:

ni=0fi=fn+2ni=1f2i1=f2nni=1f2i=f2n+11ni=1f2n=fnfn+1

  1. 两倍项关系:

f2nfn=fn1+fn+1

  1. 隔项关系:

    f2n2m2(f2n+f2n+2)=f2m+2+f4n2m,    (n>m1,n1)

    1. 将杨辉三角左对齐,所有斜率为 1 的直线上数的和为 f 的某一项

      fn=mi=0(n1ii)

      其中 m 为同一直线上数的个数。事实上这个结论是那样的显然,以至于写出来有点累赘了

    2. m|nfm|fnf(n,m)=(fn,fm)

  • 因为我觉得这个线看起来很和谐,所以就搬上来了/xyx:

    该图很好地证明了平方项求和的结论:ni=0f2i=fnfn+1

  • 生成函数: 没啥好说的,普通生成函数 F(x)=x1xx2=x+x2+2x3+3x4+...+fx

  • 矩阵递推: [fnfn+1]=[fn1fn]×[0111] ,可以快速得求出第 n 项。

  • 推广:

    • 斐波那契-卢卡斯数列:

      卢卡斯数列: 1, 3, 4, 7, 11, 18..., (斐波那契—卢卡斯递推:an=an1+an2(n2)),简而言之,初值 a0a1不同。

      以 a、b 为前两项的、满足斐波那契—卢卡斯递推的数列 F(a,b) 就是斐波那契-卢卡斯数列。其所有数列都满足勾股特征( |f2nfn1fn+1| 为定值),但不一定满足 |f2nfn1fn+1|=1自然特征

    • 广义斐波那契数列:

      递推式诸如 fn=pfn1+qfn2 的数列称为广义斐波那契数列。

      啊这我怎么感觉好多好多常见数列都是广义斐波那契数列(自然数、等差、等比……)


错位排列#

  • 定义: 最早起源于信封问题,现在可以看成:满足任意 aii 的排列数(瞎扯)

    这显然只与 n 有关,设 dn 为 n 个数字错位排列的方案数,则有:

n!=ni=0(ni)di

​ 其意义为:n 个数的全排列为 1~n 位全错位排列重新排列(i 个全错位重新分配到 n 个数中)的方案数之和。

​ 容易发现 (ni)di 为 n-i 位不错排,i 位为错排的方案数,求和即为全排列。

  • 推导公式及化简:

    • 将 (1) 式二项式反演,有通项公式

      dn=ni=0(1)i(ni)(ni)!=ni=0(1)in!(ni)!i!(ni)!=n!ni=0(1)ii!

      这个结论同样可以暴力容斥得到,但其实二项式反演的本质即容斥:

      dn=S[n](1)|S|(n|S|)!

      同样可以推出上面的通项公式。

      这对于手算来说还是太繁琐了,有更简便的计算吗?

      注意到 ex 的 Taylor 展开式为 i=0xii!,当代入 x=1 时,有 e1=i=0(1)ii!,与我们获得的通项公式中的某一项十分相似。

      当 n 很大的时候,可以近似得认为e1=ni=0(1)ii! ,代入通项公式得近似公式

      dnn!e

      经过误差考量我们发现,误差最大时将其值四舍五入即可得到正确答案,而误差随 n 而逐渐减小,故有更简便的计算公式:

      dn=n!e+12

      而这同时也说明了在 n 越来越大的时候,全排列数与错排数的比值趋近自然底数 e,真是美妙。

    • 递推公式:

      dn=(n1)(dn1+dn2)

      感性理解,放入第 n 个数字时:

      • 如果前面 n - 1 个数已是全错位排列,随便与一个数交换,也能得到一个错位排列。

      • 如果存在某个数不是错排(n - 2 位全错排),则必须与之交换,否则无法构成全错位。

      这式子与前两项都有关,我们尝试化简:

      dn=(n1)dn1+(n1)dn2dnndn1=(dn1(n1)dn2)

      cn=dnndn1, 则 c2=d2=1,易得 cn=1×(1)n2=(1)n
      得递推公式:

      dn=ndn1+(1)n

  • 生成函数: 指数型生成函数 ^D(x)=1ex(1x)

    之前已经讨论过 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) 即为环排列的生成函数 ˆGx=ln11xx(减去大小为 1 的置换环)

    则错位排列的生成函数即为:

    ^D(x)=e^A(x)=eln11xx=1(1x)ex

    泰勒展开验算:

    1+x22!+2x33!+9x44!+44x55!+...

    系数就是错排数。

  • 拓展应用:

    • 上面那个容斥的通项计算可以推广到一些特殊形式:m 个点已经给定的错排数,或 n-k 错排(理论)

    我们考虑给定了 m 个点的错排数,需要我们填的只有 n-m 个空,类似于之前容斥:

    ans=nmi=0(1)i(nmi)(nmi)!

      1. 对于 n 个数中选 m 个构成错排的方案数,一种比较直观的方法是算出所有存在非错排的方案数:

      ans=mi=max(2mn,0)(mi)(nimi)0ji(1)j(ij)(mj)!

      其含义为选出的 m 个数字中有 i 个在 [1,m] 的范围内,那么选出 i 个可能在自己位置上,方案数 (mi) ;其余有 mi 个位置,随便在剩下的 ni 个数字中选即可,方案数 (nimi) 接下来考虑这每一种构成非错排的不重不漏的方案数,套用错排计算通项即可。

      1. 对于只有一重和式的做法,可以考虑这么一种构造:一个 n 的任意排列,选前 m 个有效位,构成错排的方案数;除去 n!,也就是所有方案数。除去每次重复的 (nm)! 就可以计算出总方案数。

        mi=1(1)i1(mi)(nim)!

      在前 m 位中选 i 个位错排,剩下全随便选,容斥一下可得方案数。

卡特兰数(Catalan number)#

  • 定义:是组合数学中一个常出现于各种计数问题中的数列。百度百科上就是这么定义的。

    前几项(0开始):1,1,2,5,14,42,132,429,1430,4862,16796...,

    其中第 i 项记为ci

    我们主要研究卡特兰数的诸多实际应用,如合法出栈序列、合法括号匹配、多边形划分、二叉树形态等。

  • 生成函数: 指数型生成函数 C(x)=114x2x

    Proof:

    C(x)=i=0cnxi,C2(x)=i=0(nj=0cjcij)xi=i=0ci+1xiC(x)=1+xC2(x)

    解得

    C(x)=1±14x2x

    显而易见卡特兰数不可能有两个生成函数,考虑取舍。

    我们将 14x 暴力 Maclaurin(麦克劳林) 展开:

    14x=12x2x24x310x4...

    分别代入两个生成函数:

    C1(x)=1+12x2x24x310x4...2x=x11x2x25x3...C2(x)=11+2x+2x2+4x3+10x42x=1+x+2x+5x3...

    恭喜你推出了卡特兰数第 -1 项 显然 C2 才是正确的生成函数。

  • 计算公式:

    递归/递推公式:

    cn={1n=00in1cicni1n1

    cn=4n2n+1cn1

    该式在实际应用中有很多具体意义,见下面的“应用”。

    通项公式:

    cn=(2nn)n+1=(2nn)(2nn1)

    推导:

    14x 泰勒展开(或广义二项式展开)得到14x=[xn](4)n(12n),进而得到:

14x=0(1)n22n(12n)=0(1)n2n(12)n_2nn!=0(1)2n(21)(41)...(2n3)n!=0(1)2n12n1×(2n)!2nn!n!=0(2nn)12n

带进生成函数:

C(x)=1i=0(2ii)12ixi2x=i=012(2i+1)(2i+2i+1)xi=i=0(2ii)i+1xi

所以可得 cn=(2ii)i+1

  • 应用:

    • 多边形对角线

      Conclusion: 对于一个凸 n 边形,将其分割为若干三角形的方案数为 cn2.

      Proof: 对于某个点可以与 n-2 个点连线将多边形分成一个 a+1 边形和一个 n-a+1 边形,递归处理。

      根据卡特兰数的定义,即可证明方案数为 cn2

    • n 次进栈,n 次出栈的合法排列数

      Conclution: 为卡特兰数第 n 项。

      Proof: 通过合法方案减去不合法方案得到答案为 (2nn)(2nn1),发现即为卡特兰数通项公式 (2nn)n+1=(2nn)(1nn+1)=(2nn)(2nn1),故得证。

    • (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)(2nnk1)

    • n 对括号最多失配 k 对的方案数: (2nn)(2nnk1)

      恰好 k 对的方案数: (2nnk)(2nnk1)

    容易发现,(2nnm) 的含义即为最少完配 n-m 次错误的方案数。

References:#

[1] hxc.(2004).Fake with its applications,『特殊计数数列』,『组合数学总结2:生成函数和特殊计数数列』

posted @   云烟万象但过眼  阅读(488)  评论(0编辑  收藏  举报
编辑推荐:
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
阅读排行:
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· PPT革命!DeepSeek+Kimi=N小时工作5分钟完成?
· What?废柴, 还在本地部署DeepSeek吗?Are you kidding?
· DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地
· 程序员转型AI:行业分析
点击右上角即可分享
微信分享提示
主题色彩