#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<string>
#include<set>
#include<map>
#include<queue>
#include<vector>
using namespace std;
#define LL long long
#define maxn 100005
const int N=2;
const LL mod=1000000007;
struct node
{
LL v[N][N];
};
node matrixmul(node A,node B)
{
node ans;
for(int i=0; i<N; i++)
for(int j=0; j<N; j++)
{
ans.v[i][j]=0;
for(int k=0; k<N; k++)
ans.v[i][j]+=(A.v[i][k]*B.v[k][j])%mod;
ans.v[i][j]=ans.v[i][j]%mod;
}
return ans;
}
node power(node a,LL n)
{
node ans= {1,1,1,0};
while(n)
{
if(n&1)
ans=matrixmul(ans,a);
a=matrixmul(a,a);
n>>=1;
}
return ans;
}
int main()
{
int t;
LL n;
scanf("%d",&t);
while(t--)
{
scanf("%lld",&n);
n++;
node C={1,1,1,0};
if(n<2)puts("1");
else {
node ans=power(C,n-2);
printf("%d\n",ans.v[0][0]);
}
}
return 0;
}
斐波那契矩阵快速
最新推荐文章于 2019-09-18 17:20:56 发布