传送门
根据题目的意思,还有瞎jb凑,凑出来这个矩阵
|f[n],f[n-1],f[n-2]|=|f[n-1],f[n-2],f[n-3]|*|1,0,1,|
|1,0,0|
|0,1,0|
还是老套路矩阵快速幂就可以AC辣
#include <cstdio>
#include <iostream>
#include <cstring>
#define ll long long
using namespace std;
const int p=1e9+7;
ll ans[2][4];
ll x[4][4];
ll dx[4][4];
void init()
{
memset(ans,0,sizeof(ans));
memset(x,0,sizeof(x));
ans[1][1]=1,ans[1][2]=1,ans[1][3]=1;
x[1][1]=1,x[1][3]=1,x[2][1]=1,x[3][2]=1;
}
void ans_cf()
{
for(int i=1;i<=3;i++)
dx[1][i]=ans[1][i],ans[1][i]=0;
for(int i=1;i<=1;i++)
for(int j=1;j<=3;j++)
for(int k=1;k<=3;k++)
ans[i][j]=(ans[i][j]+(dx[i][k]*x[k][j])%p)%p;
}
void x_cf()
{
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)
dx[i][j]=x[i][j],x[i][j]=0;
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)
for(int k=1;k<=3;k++)
x[i][j]=(x[i][j]+(dx[i][k]*dx[k][j])%p)%p;
}
void fast_pow(int k)
{
while(k)
{
if(k%2) ans_cf();
k/=2;
x_cf();
}
}
int main()
{
ll n;
scanf("%lld",&n);
while(n--)
{
init();
ll w;
scanf("%lld",&w);
if(w<=3)
{
printf("1\n");
continue;
}
fast_pow(w-3);
printf("%lld\n",ans[1][1]%p);
}
return 0;
}