//每个质数长度的连续子序列中 R>=B 才行 An=An-1+An-3 //n<=4单独讨论
只要考虑2和3就可以了,因为其他任意区间都可以拆成2和3的组合,所以只要2和3满足就一定可以。
然后发现,如果新加一颗红色,只要之前的满足就可以满足,如果新加一颗蓝色,只有红红蓝这种情况下才可以,所以就有递推式F(x)=F(x-1)+F(x-3)
#include<bits/stdc++.h>
using namespace std;
const int maxn=5;
typedef long long ll;
ll mod=1e9+7;
ll n=3,a[maxn]={0,0,3,4,6};
typedef struct jz{
ll m[maxn][maxn];
}jz;
jz mul(jz a,jz b){
jz ans;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
ans.m[i][j]=0;
for(int k=1;k<=n;k++)
ans.m[i][j]=(ans.m[i][j]+a.m[i][k]*b.m[k][j]%mod)%mod;
}
return ans;
}
jz ksm(jz a,ll b){
jz ans;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
ans.m[i][j]=1*(i==j);
while(b){
if(b%2) ans=mul(ans,a);
a=mul(a,a);
b/=2;
}
return ans;
}
int main(){
ll T,k,ans;
jz A,B;
cin>>T;
while(T--){
ans=0;
cin>>k;
if(k<=4){
cout<<a[k]<<endl;
continue;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
A.m[i][j]=0;
A.m[1][1]=1;A.m[1][3]=1;
A.m[2][1]=1;
A.m[3][2]=1;
B=ksm(A,k-4);
for(int i=1;i<=n;i++)
ans=(ans+B.m[1][i]*a[5-i]%mod)%mod;
printf("%lld\n",ans);
}
}