斐波拉契
Posted shine-sky
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了斐波拉契相关的知识,希望对你有一定的参考价值。
在OI简单数论中 **斐波拉契**是常常出现的东西
是什么
斐波那契数列,又称黄金分割数列、因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=1,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用.
<p style="text-align:right">(百度百科)</p>
模板
1,递归
1 inline int Fib(int n) 2 { 3 if (n == 1 || n == 2) 4 { 5 return 1; 6 } 7 return Fib(n - 1) + Fib(n - 2); 8 }
复杂度分析 由于对于每一个1都是最后一层递归返回上来的故会递归F(n)次 , 由于斐波拉契数列是随着指数上升的 故复杂度约为O(2^n)
2,循环
1 inline int Fib(int n) 2 { 3 F[1] = F[2] = 1; 4 for(int i = 3 ; i <= n ; ++ i) 5 F[i] = F[i - 1] + F[i - 2]; 6 return F[n]; 7 }
复杂度分析 :O(n)
3,矩阵乘法优化
将数列放在矩阵乘法中会发现
$$\left[\begin{matrix}F[n - 1]\\F[n - 2]\end{matrix}\right] * \left[\begin{matrix}1 & 1\\1 & 0\end{matrix}\right] = \left[\begin{matrix}F[n]\\F[n - 1]\end{matrix}\right]$$ 即如果求F[n] $$\left[\begin{matrix}F[n]\\F[n - 1]\end{matrix}\right] = \left[\begin{matrix}F[n - 1]\\F[n - 2]\end{matrix}\right] * \left[\begin{matrix}1 & 1\\1 & 0\end{matrix}\right] = \left[\begin{matrix}F[n - 2]\\F[n - 3]\end{matrix}\right] * \left[\begin{matrix}1 & 1\\1 & 0\end{matrix}\right] ^ 2 = .... = \left[\begin{matrix}F[1] \\ F[2]\end{matrix}\right] * \left[\begin{matrix}1 & 1\\1 & 0\end{matrix}\right]^{n-1}$$ 将$$\left[\begin{matrix