组合数学——特殊计数序列(Part 1)

一.斐波那契数列

参考资料:Fibonacci数列 《组合数学》-卢开澄,百度百科,《组合数学》-Richard A.Brualdi

1.递归定义

F[n]=F[n-1]+F[n-2],F[0]=F[1]=1.
(类斐波那契数列:形如斐波那契数列,只不过 F [ 0 ] , F [ 1 ] Z

2.经典问题

(1).兔子繁殖问题

描述: 一对幼兔自出生以后,刚出生的1个月和接下来的1个月没有繁殖能力,但是总第3个月开始就开始每个月生一对幼兔。问题是一来给你一对幼兔,问你若干个月后有多少对兔子(没有兔子死亡)。初始的时候为第1个月。
分析:
这其实是一道引出斐波那契定理的题…
因为兔子不会死亡,并且出生后需要隔两个月才能生新的兔子,所以说可以这样来看:当前为第i个月,那么这个月新增的兔子只会是第i-2个月的兔子所生下的兔子,第i-1个月的兔子是不会生兔子的,但是需要被统计数量,所以说num[i]=num[i-2]+num[i-1]。(已经有的加上新增的)
所以说这就是斐波那契数列了!要注意的是在这里F[1]=1,F[2]=1,然后在这个基础上进行递推即可。

(2).骨牌覆盖问题

描述:用1*2的骨牌来覆盖一个给定大小的矩形区域,问把整个矩形铺满并且不可以超出边界的方案数。
分析:
首先是2*n的举矩阵。
每次可以横着,或者是竖着放。然后横着放是不可能错开放的,否则必然会空出一个格子无法处理;竖着放就肯定是从左到右依次放了(相当于n-1)。
那么就分这两种情况就好了:
竖着放:F[n]+=F[n-2];
横着放:F[n]+=F[n-1];
那么就是F[n]=F[n-1]+F[n-2]了,及斐波那契数列。
至于其他的n*m的情况,那么我们就可以先把每一的状态进行状态压缩。然后枚举的i行所有的状态,向着第i+1行进行转移,刷出一个totstate*totstate的矩阵,若G[s1][s2]=1,则能够从s1转移到s2;若G[s1][s2]=0,则表示不能转移。
那么就可以使用矩阵快速幂,最后乘上初始矩阵就可以了。至于涉及到的具体问题就和状压DP有关,就不提了。
通过这些,我们可以发现,2*n只不过是其中的一种特殊情况而已呢

3.性质

(1).通项公式

F n = 1 5 [ ( 1 + 5 2 ) n ( 1 5 2 ) n ]

证明:

F n = F n 1 + F n 2
F n F n 1 F n 2 = 0
F n = q n
q n q n 1 q n 2 = 0
q n 2 ( q 2 q 1 ) = 0
q 1 = 1 + 5 2 , q 2 = 1 5 2
F n = c 1 ( 1 + 5 2 ) n + c 2 ( 1 5 2 ) n
( F 0 = 0 , F 1 = 1 ) c 1 + c 2 = 0 , c 1 1 + 5 2 + c 2 1 5 2 = 1
c 1 = 1 5 , c 2 = 1 5
F n = F n = 1 5 [ ( 1 + 5 2 ) n ( 1 5 2 ) n ]

(2).gcd(F[n],F[m])=F[gcd(n,m)]
参考于证明
里面说的非常的详细,这里就再写一下。
首先要证明一堆引理:

引理一:gcd(F[n+1],F[n])=1

g c d ( F [ n + 1 ] , F [ n ] )
= g c d ( F [ n + 1 ] F [ n ] , F [ n ] )
= g c d ( F [ n ] , F [ n 1 ] )

然后如此递归下去(就像辗转相除法一样)
最终得到: g c d ( F [ 2 ] , F [ 1 ] ) = 1 得证。

引理二:F[m+n]=F[m-1]F[n]+F[m]F[n+1]

F [ n + m ] = F [ n + m 1 ] + F [ n + m 2 ]
= 2 F [ n + m 2 ] + F [ n + m 3 ]
= . . . . . .

F [ n + m ] = a [ x ] ( F [ n + m x ] + b [ x ] F [ n + m x 1 ] )
= a [ x ] ( F [ n + m x 1 ] + F [ n + m x 2 ] + b [ x ] ( F [ n + m x 1 ] ) )
= ( a [ x ] + b [ x ] ) F [ n + m x 1 ] a [ x ] F [ n + m x 2 ]
然后我们发现其实a[]和b[]似乎也是斐波那契数列。其实还真是:
当x=1时:
a [ 1 ] = F [ 2 ] , b [ 1 ] = F [ 1 ] ;
当x=2时:
a [ 2 ] = F [ 2 ] + F [ 1 ] = F [ 3 ] , b [ 2 ] = F [ 1 ] + F [ 0 ] = F [ 2 ] ;
当x=k+1时:
a [ k + 1 ] = a [ k ] + b [ k ] = F [ k + 1 ] + F [ k ] = F [ k + 2 ] , b [ k + 1 ] = a [ k ] = F [ k + 1 ] ;
那么当x=n时:
a [ n ] = F [ n + 1 ] , b [ n ] = F [ n ]
F [ m + n ] = F [ n + 1 ] F [ m ] + F [ n ] F [ m 1 ] ,得证(妙啊)

引理三:gcd(F[n+m],F[n])=gcd(F[n],F[m])

g c d ( F [ n + m ] , F [ n ] )
= g c d ( F [ n + 1 ] F [ m ] + F [ n ] [ m 1 ] , F [ n ] )
= g c d ( F [ n + 1 ] F [ m ] , F [ n ] )
= g c d ( F [ n + 1 ] , F [ n ] ) g c d ( F [ m ] , F [ n ] )
由引理1可得:
= g c d ( F [ n ] , F [ m ] )


有了以上的引理之后,由辗转相除法(扩展欧几里得)可知:
g c d ( F [ n ] , F [ m ] ) = F [ g c d ( n , m ) ] //之后会补上具体的说明

(3).若干等式

1). F 1 + F 2 + F 3 + F 4 . . . + F n = F n + 2 1
2). F 1 + F 3 + F 5 + F 7 + . . . + F 2 n 1 = F 2 n
以上两个等式可以将斐波那契递归定义的式子写出来,将左边的分别相加,将右边的分别相加,就可以了。(比较简单,这里就不细证了)

(4). lim n > i n f F n F n + 1 = 5 1 2

由F[n+2]=F[n]+F[n+1]可得:
F n F n + 1 + 1 = F n + 2 F n + 1
设极限为x;
x + 1 = 1 x
那么 x = 5 1 2

(5).

从第二项开始,从第二项开始,每个奇数项的平方都比前后两项之积少1,每个偶数项的平方都比前后两项之积多1。(奇偶是指项数的奇偶)
证明居然是。。。。经计算可得!!

(6).

斐波那契数列的第n+2项同时也代表了集合{1,2,…,n}中所有不包含相邻正整数的子集个数。

(7).斐波那契函数的运用

斐波那契数列的运用好像就看见了一个“优选法”,除此之外,和组合数学相关的内容除了一堆组合数恒等式之外好像就没有什么了…
下面我们来介绍优选法(又叫0.618法)。
优选法主要针对的是在一个单峰区间内查找峰值(现在假设是有极大值),其实就是三分查找。
我们原来的三分查找是用mid,mmid( L < m i d < m m i d < R ),两个值进行比较,而优选法也没有改变这一原则,只不过对于mid和mmid的选值进行了特殊的要求。
假设区间是(0,1),那么现在有x1=0.382,x2=0.618(其实跟黄金分割有关),假设我们现在要割舍掉的是(x2,1)这个区间,那么剩下的就是(0,0.618)这个区间了。这个时候,我们新取的x1=0.618*0.382=0.236,x2=0.382,仍然是满足要求的。但是在这个时候,我们发现x=0.382这个值在之前已经算过了,那么我们就不必再所以一边,就只需要算出x=0.236的答案就可以了。这样先来,每一次只会计算一次,充分的利用了之前的信息,效率提高了不少。
以上只是感性认知一下,下面介绍具体过程(话说这本书讲的真是具体):

  1. 初始区间为(A,B)。x1=A+0.382(B-A),x2=A+0.618(B-A),val1=f(x1),val2=f(x2).
  2. 如果 B-A < EPS,那么判断val1和val2的大小,输出大的那一个(因为是求极大值)
  3. 否则如果val1 > val2,令B=x2,x2=x1,val2=val1,x1=A+0.382(B-A),val1=f(x1),回到第2步继续三分;
  4. 如果val1 < val2,令A=x1,x1=x2,val1=val2,x2=A+0.618(B-A),val2=f(x2),回到第2步继续三分;
  5. 否则A=x1,B=x2,回到第1步继续三分。

这样一来简直超越了传统的三分了呢。
下面才是用斐波那契做的优选法。
若选择区间为(a,b),则将(a,b)分成F[n+1]段,然后就有变成有n+2个决策点,我们从F[n]开始从后往前扫。
当发现f(F[n-1]) > f(F[n])时,舍掉(F[n],F[n+1])这个区间,变成(0,F[n]),同时保留F[n-1]以进行下一次计算。若f(F[n-1]) < f(F[n])则舍掉(0,F[n-1])这个区间,变成(F[n-1],F[n+1]),里面仍然有F[n+1]-F[n-1]=F[n]个段。然后就在新的区间里面找。剩下的递归即可。
每一次都可以将决策点由n个变为n-1个(段数由F[n]变为F[n-1]),那就是O(n)得了。
这种方法的优秀之处在于,它可以对付整数的情况。不足F[n+1]的情况可以加入虚点,只要保证这些虚点比所有点差就行了。(好像这些东西和组合计数真的没有关系呢(つД`))

(8).任意一个正整数都有唯一的表达形式:

n = F k 1 + F k 2 + F k 3 + . . + F k r ( k i k i 1 2 )
用数学归纳法可证明。(结论相对于证明要重要一些)

(9). F k n F n

其实这个公式是有 F n + k = F k F n + 1 + F k 1 F n 推导出来的,但是由于没有怎么看懂它的证明,这里就先放一放吧….

(10).还有一些结论,个人感觉没什么用处,就不添上来了……

二.Catalan数

1.定义&递推式

卡特兰数似乎有一堆定义以及递推式,这里列举几种。

(1).

h 0 = h 1 = 1 ;
h n = h 0 h n 1 + h 1 h n 2 + . . . + h n 1 h 0

(2).

h n = h n 1 4 n 2 n + 1

(3).

h n = C ( 2 n , n ) n + 1 ( n = 0 , 1 , 2...... )

(4).

h n = C ( 2 n , n ) C ( 2 n , n 1 ) ( n = 0 , 1 , 2...... )

(5).

是有n+1条边的凸多边形被在其内部的不相交的对角线划分成三角形区域的方案数。

我觉得这可真是太神奇了,单单是这些定义都得衍生出多少的性质和经典例题出来啊…

2.例题&定理

(1).

有一个由n个+1和-1构成的2n项序列a。
其前缀和总满足 s u m [ k ] 0 ( k = 1 , 2 , 3 , . . . , 2 n )
结论:序列的个数等于第n个Catalan数。
C n = 1 n + 1 C ( 2 n , n ) ( n >= 0 )
证明:
我们定义两个集合
A:题目中要求的序列,我们称为合法集合;
B:违反题目要求的序列,我们称为非法序列。
那么可得 | A | = | t o t | | B | = C ( 2 n , n ) | B | ,那么我们接下来就算|B|就可以了。
考虑非法集合中的一个元素,即一个序列;
设k为满足sum[k]<0的第一个元素,注意,是第一个。
那么它满足一些性质:

(1)k是一个奇数
(2)a[1],a[2],a[3]...a[k-1]中,正好有(k-1)/2个+1,有(k-1)/2个-1
(3)a[k]为-1

只有满足了以上性质,才满足我们对于k的定义。
那么现在我们对于a1,a2,a3…ak这些元素都取反,即令ai=-ai,那么在整个序列中,就会变成有(n+1)个+1,有(n-1)个-1,(因为只有ak的改变会引起数量上的变化)。这样子反过来也是成立的。即一个含有(n+1)个+1,(n-1)个-1的序列,总存在一个位置使得sum[k]>0,这样将前k项取反后,就成为了一个非法集合中的一个序列。那么|B|=含有(n+1)个+1,含有(n-1)个-1的排列数。

| B | = ( 2 n ) ! ( n + 1 ) ! ( n 1 ) !

这样就可以用总数减去|B|了:
| A | = ( 2 n ) ! n ! n ! ( 2 n ) ! ( n + 1 ) ! ( n 1 ) ! = ( 2 n ) ! ( n + 1 ) n ! n ! ( n + 1 ) ( 2 n ) ! n ( n + 1 ) ! ( n 1 ) ! n
= ( 2 n ) ! n ! ( n + 1 ) ! = ( 2 n ) ! n ! n ! 1 n + 1 = 1 n + 1 C ( 2 n , n )
得证。(虽然感觉有点不严谨(也许是我太笨了),但是感性认知了一下应该是对的)只要能够把这个模型套到题目里面,也就是在做题的时候想起这个定理,就可以了。

(2).Catalan数具有1阶的齐次递推关系(系数非常数)

根据我们之前的定义和上一道题的推理,有 C n = 1 n + 1 C ( 2 n , n ) = 1 n + 1 ( 2 n ) ! n ! n ! .
那么 C n 1 = 1 n C ( 2 ( n 1 ) , n 1 ) = 1 n ( 2 n 2 ) ! ( n 1 ) ! ( n 1 ) !
C n C n 1 = 4 n 2 n + 1 , C 0 = 1 ,这样就可以递推求Catalan数了。

3.拟Catalan数

在书上乍一看这玩意好像十分恐怖。
定义拟Catalan数 C n = n ! C n 1 ( n = 1 , 2 , 3...... )
那么我们再来看拟Catalan数的1阶递推式:
C n = n ! C n 1 = n ! 4 n 6 n C n 2 = ( 4 n 6 ) ( n 1 ) ! C n 2 = ( 4 n 6 ) C n 1 C 0 = 1
简直太妙了,连拟Catalan数也有1阶齐次递推式了!
当然你也可以直接根据拟Catalan数的定义求出它的通项公式:
C n = ( n 1 ) ! C ( 2 ( n 1 ) , n 1 ) = ( 2 n 2 ) ! ( n 1 ) ! ( n 1 )
探究拟Catalan数与Catalan数的关系的一道例题:
设a1,a2,a3…an n个数,现在需要把这些数乘起来(一共乘n-1次),但是乘法的顺序不同也会视作不同的方案。同样的,乘数排列的顺序不同也会被视作不同的方案。比如(a1*a2)*a3与(a2*a1)*a3是两种不同的方案。现在问的是有多少种不同的方案。
设h[n]为有n个数的时候的方案数。
为了推出递推关系,我们需要考虑如何从h[n-1]转移到h[n]。
书上给出了两种证明方式,我只看懂了其中的第二种,现在介绍一下。
加入第n个数,考虑之前的(n-2)次乘法中,每次乘法都有两个乘数,然后当前第n个数就可以放在任意一个乘数的任意一侧。
举个例子:由n=5->n=6
假设乘法中的一部分是(a1*a2)*a5
那么就会衍生出以下的新的乘法:
((a1*a2)*a6)*a5
(a6*(a1*a2))*a5
(a1*a2)*(a6*a5)
(a1*a2)*(a5*a6)
这样子就有4种新的乘法途径。
但是还需要考虑一点,就是an可以作为最后一次乘法的左边那个因子,或者是右边那个因子,因此还需要加上2。
h n = h n 1 ( 4 ( n 2 ) + 2 ) = ( 4 n 6 ) h n 1

等等,这不就是拟Catalan数吗??
还有更神奇的:
现在我们考虑不考虑乘数顺序的情况
g n = h n n ! = 1 n ! n ! C n 1 = C n 1

它是第n-1个Catalan数!
其实从拟Catalan数的定义式上来看就已经有感觉了,估计乘上一个n!就是这个意思。现在是不是感觉拟Catalan数其实也没有那么难了呢?
还没有完。
我们甚至可以从这道题推出,Catalan数的另外一个递推式(不考虑顺序):
考虑最后一次乘法:
(a1,a2,a3,a4…ak)*(ak+1…..an)
这种情况下的贡献为g[k]*g[n-k]。考虑到k的取值可以是1~n-1那么最终的答案就是:
g n = g 1 g n 1 + g 2 g n 2 . . . g n 1 g 1
这不就是Catalan数的某个递推定义吗?
现在我们可以再来看一下之前的定理5。
将边标号后,我们可以将连一条边看作是做了一次乘法。像这样:
这里写图片描述
这样就对应出了一个乘法序列(假设最下方的顶点是最后一次乘法发生的地方),前提是不考虑乘数的顺序。然后就和之前所说的结论是一模一样的了。
Part1就到这里吧,Part2将会介绍格路径和Schroder数。

猜你喜欢

转载自blog.csdn.net/G20202502/article/details/82427878