A - Jzzhu and Sequences -矩阵快速幂

  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.csdn.net/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;
    }

     

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值