Fibonacci 数列的性质很多,有的常考,有的不常考。
这些性质都有可能是解题关键。这里稍作总结。
Fibonacci 的定义很多,本文采取如下的递归定义:
fi=⎩⎪⎨⎪⎧0 i=01 i=1fi−1+fi−2 i≥2
广义 Fibonacci 对于 f0 和 f1 的定义不变,剩下的项为:
fn=pfn−1+qfn−2 n≥2
从 fn 到 fk
Fibonacci 数最好的性质就是定义(出自《Imakf 本纪》):
fi=fi−1+fi−2
直接暴力展开上面的定义式可以得到 Fibonacci 数的另一个重要性质
fn=fkfn−k+1+fk−1fn−k
这个性质提供了从 fn 凑 fk 的一条直接途径。
广义 Fibonacci 数列是类似的。
二次 fn,fn−1 的关系
Fibonacci 相邻项之间的关系除了定义式外还有一条有趣的性质:
fn−12−fn2+fn−1fn=fn−1fn+1−fn2=(−1)n
归纳证明。n=1 时原式成立。假设当 n<m 时原式成立。
对于 fm,我们把上左式的 fm 展开,可以得到:
fm−12−(fm−1+fm−2)2+fm−1(fm−1+fm−2)=fm−12−fm−22−fm−1fm−2=(−1)×(−1)m−1=(−1)m
我们可以把上面的式子写成另一个形式:
fn−12≡cn(modfn)
其中 c 是一个常数。
对于广义 Fibonacci 数列,上式仍然成立,只是 c 有所变化。
当 n=1 时, fn−1fn+1−fn2=−1。
当 n=2 时,
fn−1fn+1−fn2=fn−1(pfn+qfn−1)−fn2=qfn−12+pfnfn−1−fn(pfn−1+qfn−2)=qfn−12−qfnfn−2=−q(fn−2fn−fn−12)
所以对于 广义 Fibonacci 数列而言, c 应该为 −q 。
向负下标的扩展
通过 fn=fn+2−fn+1 ,即使下标为负数,我们也可以求出对应的 Fibonacci 数。在本文的 Fibonacci 定义下,正负 Fibonacci 的转化可以写成:
f−n=(−1)n−1fn
gcd 相关
首先有个小性质:
gcd(fn,fn+1)=1
直接归纳就可以证明了...?
关于 gcd 有一个更加广为流传的式子:
gcd(fn,fm)=fgcd(n,m)
证明可以从辗转相除法入手。我们现在是 fn ,我们怎么凑出 fm 呢...?
Bingo!不要忘记了第一个小标题的性质。以下假设 n>m 。
fn=fmfn−m+1+fm−1fn−m
然后有 gcd(a,b)=gcd(a,a mod b) 。所以 gcd(fn,fm)=gcd(fn−m,fm)=fgcd(n,m)
下标和值上面的 gcd 可以实现互换。
Fibonacci 进制数
Fibonacci 进制数,就是把一个数用若干个 Fibonacci 数来表示,要求每个 Fibonacci 数只能用一次。构造的话可以从高到低枚举 Fibonacci 数一个一个删。
Fibonacci 进制下有很好的性质。
- 不会有连续两个 1 。
- 可以通过将一个 1 平推得到该数新的斐波那契表示。平推后会得到两个 1 ,下标大的 1 必然不能再平推。所以,在 Fibonacci 进制下,每两个 1 的段是相对独立的。考虑时可以一段一段考虑。
经典的例题有 BJOI2012最多的方案 。