rt,不知道为什么
矩阵居然满足了交换律(好吧,应该是某些奇妙错误)
#include<bits/stdc++.h>
#define ll long long
#define il inline
#define N 3
using namespace std;
il ll read(){ll x=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-'){w=-1;}ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*w;}
ll k,m=1e9+7,T;
struct Mat{
ll a[N][N];
Mat(){memset(a,0,sizeof(a));}
inline void build(){
for(int i=0;i<N;++i)a[i][i]=1;
}
Mat operator*(const Mat&x){
Mat ans;
for(int i=0;i<N;++i){for(int j=0;j<N;++j){for(int k=0;k<N;++k){
ans.a[i][j]+=(a[i][k]*x.a[k][j])%m;
}
ans.a[i][j]=(((ans.a[i][j]%m)+m)%m);
}}
return ans;
}
};
Mat a,c;
il Mat qpow(Mat b,ll c) {
Mat ans;
ans.a[0][0]=1;ans.a[0][1]=0;ans.a[0][2]=0;
ans.a[1][0]=0;ans.a[1][1]=1;ans.a[1][2]=0;
ans.a[2][0]=0;ans.a[2][1]=0;ans.a[2][2]=1;
for(;c;c>>=1,b=b*b)if(c&1){ans=ans*b;}
return ans;
}
int main(){
T=read();
c.a[0][0]=1;c.a[0][1]=0;c.a[0][2]=1;
c.a[1][0]=1;c.a[1][1]=0;c.a[1][2]=0;
c.a[2][0]=0;c.a[2][1]=1;c.a[2][2]=0;
for(int i=0;i<T;i++){
a=qpow(c,read()-1);
printf("%lld\n",a.a[0][0]);
}
return 0;
}