#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=3; //矩阵大小
const int mod=1e9+7;
struct Matrix{
ll m[maxn][maxn];
Matrix(){
memset(m,0,sizeof(m));
}
};
Matrix Multi(Matrix a,Matrix b){
Matrix res;
for(int i=0;i<maxn;i++){
for(int j=0;j<maxn;j++){
for(int k=0;k<maxn;k++){
res.m[i][j]=(res.m[i][j]+ (a.m[i][k]%mod) *( b.m[k][j]%mod)%mod ) %mod;
}
}
}
return res;
}
Matrix fastm(Matrix a,ll num){
Matrix res;
res.m[0][0]=6;
res.m[1][0]=4;
res.m[2][0]=3;
while(num){
if(num&1){
res=Multi(a,res);
}
a=Multi(a,a);
num>>=1;
}
return res;
}
int ans[3]={3,4,6};
int main(){
int t;
scanf("%d",&t);
while(t--){
ll n;
scanf("%lld",&n);
if(n<=4){
printf("%d\n",ans[n-2]);
}else{
Matrix a;
a.m[0][0]=1;
a.m[0][1]=0;
a.m[0][2]=1;
a.m[1][0]=1;
a.m[1][1]=0;
a.m[1][2]=0;
a.m[2][0]=0;
a.m[2][1]=1;
a.m[2][2]=0;
a=fastm(a,n-4);
printf("%lld\n",a.m[0][0]);
}
}
return 0;
}
原文:https://www.cnblogs.com/lyj1/p/11945505.html