版权声明:编写不易,转载请注明出处,谢谢。 https://blog.csdn.net/qingshui23/article/details/82318221
已知斐波那契数列
求
其实一看到这个题目,很显然想到矩阵快速幂,那么我们就根据这个思路往下想,那么我们写出
我们令 ,那么写出 的递推式:
我们令 ,那么写出 的递推式:
所以,将式 带入 得到:
一步步回代到 ,最终 的递推式为:
那么就有:
其中 为 的矩阵,那么矩阵 如下:
将式 变为下述式子:
那么最终的
其中 为 矩阵 计算后的结果。
代码如下:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
typedef long long LL;
const LL MOD = 1e9+7;
struct Matrix
{
LL mat[5][5];
};
Matrix Multi(Matrix A, Matrix B)
{
Matrix C;
for(int i=0; i<5; i++)
{
for(int j=0; j<5; j++)
{
C.mat[i][j] = 0;
for(int k=0; k<5; k++)
{
C.mat[i][j] = (C.mat[i][j]+A.mat[i][k]*B.mat[k][j]%MOD)%MOD;
}
}
}
return C;
}
Matrix Pow(Matrix A, LL b)
{
Matrix ans;
memset(ans.mat, 0, sizeof ans.mat);
for(int i=0; i<5; i++) ans.mat[i][i] = 1;
while(b)
{
if(b&1) ans=Multi(ans, A);
b>>=1;
A = Multi(A, A);
}
return ans;
}
int main()
{
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
int T; cin>>T;
while(T--)
{
LL n; cin>>n;
Matrix tmp;
memset(tmp.mat, 0, sizeof tmp.mat);
tmp.mat[0][0] = tmp.mat[1][0] = tmp.mat[2][0] = tmp.mat[3][0] = 1;
tmp.mat[1][1] = tmp.mat[2][1] = tmp.mat[3][1] = 1;
tmp.mat[2][2] = tmp.mat[3][2] = 1;
tmp.mat[3][3] = tmp.mat[4][3] = 1;
tmp.mat[3][4] = 1;
tmp = Pow(tmp, n-1);
LL ans=tmp.mat[0][0]+tmp.mat[1][0]+tmp.mat[2][0]+tmp.mat[3][0]+tmp.mat[4][0];
ans = (ans%MOD+MOD)%MOD;
cout<<ans<<endl;
}
return 0;
}