斐波拉契

在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 }
View Code

复杂度分析 由于对于每一个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 }
View Code

复杂度分析 :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}F[1] \\ F[2]\end{matrix}\right]$$

拓展到2 * 2即

$$\left[\begin{matrix}1 & 0 \\ 0 & 1\end{matrix}\right]$$

猜你喜欢

转载自www.cnblogs.com/Shine-Sky/p/9076232.html
今日推荐