AC日记——斐波那契数列 洛谷 P1962

斐波那契数列

 

思路:

  矩阵快速幂;

 

来,上代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

#define mod 1000000007

struct MatrixType {
    long long ai[3][3];
    
    void mem()
    {
        for(int i=0;i<3;i++)
        {
            for(int j=0;j<3;j++) ai[i][j]=0;
        }
    }
};

long long n;

MatrixType mul(MatrixType a,MatrixType b)
{
    MatrixType res;
    res.mem();
    for(int i=1;i<=2;i++)
    {
        for(int j=1;j<=2;j++)
        {
            for(int v=1;v<=2;v++) res.ai[i][j]=(res.ai[i][j]+(a.ai[i][v]*b.ai[v][j])%mod)%mod;
        }
    }
    return res;
}

long long poww(long long mi)
{
    MatrixType pos,mii;
    pos.mem(),mii.mem();
    pos.ai[1][1]=1,pos.ai[1][2]=0;
    pos.ai[2][1]=0,pos.ai[2][2]=0;
    mii.ai[1][1]=1,mii.ai[1][2]=1;
    mii.ai[2][1]=1,mii.ai[2][2]=0;
    while(mi>0)
    {
        if(mi&1) pos=mul(pos,mii);
        mi=mi>>1,mii=mul(mii,mii);
    }
    return pos.ai[1][1];
}

int main()
{
    scanf("%lld",&n);
    cout<<poww(--n)%mod;
    return 0;
}

 

posted @ 2017-04-26 08:05  IIIIIIIIIU  阅读(208)  评论(0编辑  收藏  举报