A - Jzzhu and Sequences -矩阵快速幂

本文介绍了一种使用矩阵快速幂算法高效计算斐波那契数列第n项的方法,通过构建特定矩阵并利用快速幂运算,可以在O(logn)时间内求解斐波那契数列,避免了传统递归方法的时间复杂度过高问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 
    给定f1和f2,求fn
    分析:
    特判f1,f2
    当n>=3时使用矩阵快速幂即可
    将公式转化一下 , 可以得到一个变换矩阵
    由F(i)=F(i-1)+F(i+1);
     将左式移到右边得
      F(i+i)=F(i)-F(i-1);
    下标同时减一得
      F(i)=F(i-1)-F(i-2);
    从而构造矩阵
    (F(i-1),F(i-2))*[1  1 ]=(F(i),F(i-1))
                    [-1 0 ]
    带入i=3,得
    (F(2)=y,F(1)=x)*[1  1 ]^(i-2)=(F(3),F(2))
                    [-1 0 ]
    转自:https://blog.youkuaiyun.com/u013050857/article/details/44998799#comments
    #include<bits/stdc++.h>
    using namespace std;
    long long n,x,y,mod=1000000007;
    #define ll long long
    struct mat
    {
        ll a[5][5];
    } ans,e,base;
    mat matrlc(mat x,mat y,int len)
    {
        mat c;
        for(int i=0; i<len; i++)
            for(int j=0; j<len; j++)
            {
                c.a[i][j]=0;
                for(int k=0; k<len; k++)
                {
                    c.a[i][j]+=x.a[i][k]*y.a[k][j];
                }
            }
        return c;
    }
    void qpow(mat x,ll b)
    {
        for(int i=0; i<2; i++)
            ans.a[i][i]=1;
        while(b)
        {
            if(b%2)
            {
                ans=matrlc(ans,x,2);
            }
            x=matrlc(x,x,2);
            b/=2;
        }
    }
    int main()
    {
        base.a[0][0]=1;
        base.a[0][1]=1;
        base.a[1][0]=-1;
        base.a[1][1]=0;
        cin>>x>>y>>n;
        if(n==1)
            cout<<((x%mod)+mod)%mod;
        else if(n==2)
            cout<<((y%mod)+mod)%mod;
        else
        {
            qpow(base,n-2);
            cout<<(((ans.a[0][0]*y+ans.a[1][0]*x)%mod)+mod)%mod<<endl;
        }
        return 0;
    }

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值