牛客-牛牛的Fib序列(矩阵快速幂)

链接:https://ac.nowcoder.com/acm/contest/6357/A
来源:牛客网
 

题目描述

牛牛重新定义了斐波那契数列,牛牛定义f(n) = f(n-1)+f(n+1); f(1)=a, f(2)=b, 现在给定初始值 a, b,现在求第n项f(n)%1000000007的值。

其中 1<=|x|, |y|, n<=10^9 

 

示例1

输入

 

1,2,3

输出

 

1

说明

f(2)=f(3)+f(1), 所以f(3) = f(2)-f(1)=2-1=1

示例2

输入

 

-1,-2,3

输出

 

1000000006

说明

同样例1:f(3)=-1%1000000007=1000000006

备注:

最终的答案应是一个非负整数,如-1 % 1000000007 = 1000000006

思路:矩阵快速幂。

求解的最初矩阵 b a; a(这个是0也行不影响) 0;

乘的矩阵 1 1; -1 0;

之前对于矩阵快速幂的理解一直不是很透彻,导致今晚上一个小时全弄这个题了。

就是你自己推的矩阵要一直乘,而不是乘原始的矩阵。

 具体见代码

class Solution {
    typedef long long ll;
    const ll mod = 1e9+7;
    struct node
    {
        ll a[2][2];
        const ll mod = 1e9+7;
        void operator*=(const node& y)
        {
            int i,j,k;
            ll t[2][2];
            memset(t,0,sizeof(t));
            for(i=0;i<2;i++)for(j=0;j<2;j++)for(k=0;k<2;k++)
                t[i][j]=(t[i][j]+(a[i][k]*y.a[k][j]+mod)%mod)%mod;
            for(i=0;i<2;i++)for(j=0;j<2;j++)a[i][j]=t[i][j];
        }
    }A,S;
public:
    ll solve(int a, int b, int n) {
        A.a[0][0]=A.a[0][1]=1;
        A.a[1][0]=-1;
        A.a[1][1]=0;
        S.a[0][0]=(b+mod)%mod;
        S.a[0][1]=(a+mod)%mod;
        S.a[1][1]=(a+mod)%mod;
        if(n==1)return S.a[0][1];
        n-=2;
        for(;n;n>>=1,A*=A)if(n&1)S*=A;
        return S.a[0][0];
    }
};

 

你可能感兴趣的:(数据结构,快速幂)