利用矩阵求斐波那契数列

通过此公式可以将斐波那契数列转化为求矩阵的n - 1次方

利用矩阵的快速幂求斐波那契数列的代码实现

#include
#include
#define MOD 1000000007
struct juzhen
{
    long long aa[2][2];
};

//矩阵的快速幂
juzhen chengfa(juzhen &a,juzhen &b)
{
    juzhen c;
    memset(c.aa,0,sizeof(c.aa));
    for(int i = 0;i < 2;i++)
    {
        for(int j = 0;j < 2;j++)
        {
            for(int k = 0;k < 2;k++)
            {
                c.aa[i][j] = (c.aa[i][j] + a.aa[i][k] * b.aa[k][j]) % MOD;
            }
        }
    }
    return c;
}

juzhen pow(juzhen a,long long n)
{
    juzhen ans;
    for(int i = 0;i < 2;i++)
    {
        for(int j = 0;j < 2;j++)
        {
            if(i == j)
            {
                ans.aa[i][j] = 1;
            }
            else ans.aa[i][j] = 0;
        }
    }
    while(n)
    {
        if(n & 1)
            ans = chengfa(ans,a);
        a = chengfa(a,a);
        n /= 2;
    }
    return ans;
}

int main()
{
    long long n;
    juzhen a,b;
    scanf("%I64d",&n);
    a.aa[0][0] = a.aa[0][1] = a.aa[1][0] = 1;
    a.aa[1][1] = 0;
    b = pow(a,n);
    printf("%I64d",b.aa[0][1] % MOD);
    return 0;
}

你可能感兴趣的:(算法)