斐波那契 小解

来源:互联网 发布:学高中化学的软件 编辑:程序博客网 时间:2024/06/08 10:54
/**一般来说斐波那契数列一般和矩阵快速幂是结合在一起用的;http://www.nbuoj.com/v8.8/Problems/Problem.php?pid=2718;这个题呢就是求一个平方求和的一个东西,很皮;关键是哪个取模的问题,这个就很尴尬了,看了半天最后才a出来的;平方和:f(n)*f(n+1);ln项和:f(n+2)-1;*/#include<cstdio>#include<cstring>#include<bits/stdc++.h>using namespace std;typedef long long LL;const LL mod1=1000000006;const LL mod=1000000000+7;struct mat {LL a[2][2];};mat mat_mul(mat x,mat y){    mat res;    for(int i=0;i<2;i++)        for(int j=0;j<2;j++)        res.a[i][j]=0;    for(int i=0;i<2;i++)        for(int j=0;j<2;j++)        for(int k=0;k<2;k++)        {            res.a[i][j]+=(x.a[i][k]*y.a[k][j]%mod1);            res.a[i][j]%=mod1;        }    return res;}mat mat_pow(mat c,LL n){    mat res;    for(int i=0;i<2;i++)        for(int j=0;j<2;j++)        res.a[i][j]=(i==j);    while(n)    {        if(n&1) res=mat_mul(res,c);        c=mat_mul(c,c);        n>>=1;    }    return res;}LL P(LL a,LL b){    LL ans=1;    while(b)    {        if(b&1) ans=(ans*a)%mod;        a=a*a%mod;        b>>=1;    }    return ans;}int main(){    LL n,m;    mat Q;    while(cin>>n>>m)    {        Q.a[0][0]=1;        Q.a[0][1]=1;        Q.a[1][0]=1;        Q.a[1][1]=0;        Q=mat_pow(Q,m);        LL ans1=Q.a[0][0];        LL ans2=Q.a[0][0]+Q.a[1][0];        n%=mod;        LL ans=P(n,ans1*ans2-1);        cout<<ans<<endl;    }    return 0;}