统计每个月兔子的总数【斐波那契】

题目

描述

有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

输入

输入int型表示month

输出

输出兔子总数int型

样例输入

9

样例输出

34

思路

斐波那契数列。。。
第一个月 1对兔子
第二个月 1对兔子
第三个月 2对兔子
第四个月 3对兔子
。。。。

代码

#include 
using namespace std;
int Facbonali(int num)
{
    if(num==0)
    {
        return 0;
    }
    else if(num==1)
    {
        return 1;
    }
    else
    {
        return Facbonali(num-1)+Facbonali(num-2);
    }

}
int main()
{
    int N;
    cin>>N;
    cout<

说到斐波那契数列

Fibonacci数列定义为:f(n) = f(n-1) + f(n-2), f(0) = 0, f(1) = 1;问题:输入n,请给出求f(n)的时间复杂度不超过O(logn)的算法。

首先,我们构造两个向量v1=(f(n+1), f(n))和v2=(f(n+2), f(n+1)),根据Fibonacci
数列性质,我们可以得到从v1到v2的递推变换矩阵:

[f(n+2)f(n+1)]=[1110][f(n+1)f(n)]

并进一步得到:

[f(n+1)f(n)]=[1110]n[f(1)f(0)]

这样就把线性递推问题转化为了矩阵的n次幂经典问题,在O(log n)时间复杂度内解决。除了线性递推数列,初等数学中著名的n元一次方程组问题也可以转化为矩阵和向量乘法形式更容易地解决。这个例子是想说明,凡是满足线性关系的系统都是向量模型的用武之地,我们往往可以把它转化为线性代数得到简洁高效的解决方案。



详情可以参考:

参考资料:斐波那契数列http://www.hawstein.com/

你可能感兴趣的:(那些年我写过的渣代码,有趣的算法)