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];
}
矩阵快速幂求Fibonacci
最新推荐文章于 2022-03-20 20:31:44 发布