矩阵快速幂求Fibonacci

来源:互联网 发布:sql 字符串拼接 编辑:程序博客网 时间:2024/03/29 22:35
const long long MOD=1e9+7;//c++对于const有优化,要比非const快 struct Matrix{    long long mat[2][2];    Matrix operator *(const Matrix &b)const    {        Matrix ret;        for(int i = 0;i < 2;i++)            for(int j = 0;j < 2;j++)            {                ret.mat[i][j] = 0;                for(int k = 0;k < 2;k++)                {                    ret.mat[i][j] += (long long)mat[i][k]*b.mat[k][j]%MOD;                    if(ret.mat[i][j] >= MOD)                        ret.mat[i][j] -= MOD;                }            }        return ret;    }};Matrix pow_M(Matrix a,long long n){    Matrix ret;    memset(ret.mat,0,sizeof(ret.mat));    ret.mat[0][0] = ret.mat[1][1] = 1;    Matrix tmp = a;    while(n)    {        if(n&1)ret = ret*tmp;        tmp = tmp*tmp;        n >>= 1;    }    return ret;}   long long calc(long long n){    Matrix A;    A.mat[0][0] = 0;    A.mat[1][0] = 1;    A.mat[0][1] = 1;    A.mat[1][1] = 1;    A = pow_M(A,n);    return A.mat[1][0];}

0 0