斐波那契数列 Fibonacci sequence

   见代码。-&- 

  

#include<iostream>
#include<cstdio>
#include<cstring>
typedef long long int ll;
using namespace std;
// 1.时间复杂度为 2^2
ll Fibo1(ll n)
{
    if(n==1||n==0)
        return n;
    else
        return Fibo1(n-1)+Fibo1(n-2);
}
//2.时间复杂度为 O(n)
ll Fibo2(ll n)
{
    ll oneback,twoback,current;
    if(n==1||n==0)
        return n;
    else
    {
        oneback=0;
        twoback=1;
        for(ll i=2;i<=n;i++)
        {
            current=oneback+twoback;
            oneback=twoback;
            twoback=current;
        }
        return current;
    }
}
int main()
{
   // freopen("in.txt","r",stdin);
    ll n;
    scanf("%I64d",&n);
    printf("%I64d\n",Fibo1(n));
    printf("%I64d\n",Fibo2(n));
    return 0;
}

 超级无敌矩阵求 斐波那契 的第n 项:

  数列的递推公式为:f(1)=1,f(2)=2,f(n)=f(n-1)+f(n-2)(n>=3)

  用矩阵表示为:

 进一步,可以得出直接推导公式:

然后就矩阵的快速幂。(详情见代码)

题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1242

#include<iostream>
#include<cstdio>
#include<cstring>
#define N 1000000009
typedef long long int ll;
using namespace std;
struct matrix  //定义矩阵
{
    ll m11,m12,m21,m22;
};

matrix mil(matrix a,matrix b) // 2*2 矩阵的乘法
{
    matrix ans;
    ans.m11=(a.m11*b.m11%N+a.m12*b.m21%N)%N;
    ans.m12=(a.m11*b.m12%N+a.m12*b.m22%N)%N;
    ans.m21=(a.m21*b.m11%N+a.m22*b.m21%N)%N;
    ans.m22=(a.m21*b.m12%N+a.m22*b.m22%N)%N;
    return ans;
}
matrix quickpow(ll n) // 矩阵的n次幂 
{
    matrix m={1,1,1,0},b={1,0,0,1};
    if(n==0)
        return b;
    while(n>0)
    {
        if(n&1)
            b=mil(b,m);
        n=n>>1;
        m=mil(m,m);
    }
    return b;
}
int main()
{
    ll n,sum;
    matrix a;
    while(scanf("%I64d",&n)!=EOF)
    {
        if(n==0)
        {
            printf("0\n");
            continue;
        }
        else if(n==1)
        {
            printf("1\n");
            continue;
        }
        else{
        a=quickpow(n-1);
        sum=a.m11%N;
        printf("%I64d\n",sum);
        }
    }
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值