首页 > 代码库 > AC日记——斐波那契数列 洛谷 P1962

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

斐波那契数列

 

思路:

  矩阵快速幂;

 

来,上代码:

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define mod 1000000007struct 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;}

 

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