一直以为斐波那契数列没有通项,通项:(上述应该也可以叫做通项公式吧)
这个公式解决本题我没有用到;
变为乘法后,就用矩阵快速幂啦,
ac代码:
#include<iostream>
#define ll long long
using namespace std;
const int M=1e9+7;
struct mix{
ll a[3][3];
};
mix ans,num;
mix mul(mix x,mix y){
mix tmp={{{0,0,0},{0,0,0},{0,0,0}}};
for(int i=0;i<=2;i++)
for(int j=0;j<=2;j++)
for(int k=0;k<=2;k++)
tmp.a[i][j]=(tmp.a[i][j]+(x.a[i][k]*y.a[k][j])%M)%M;
return tmp;
}
void pw(ll k){
while(k){
if(k&1) ans=mul(ans,num);
num=mul(num,num);
k>>=1;
}
}
int main(){
int n; cin>>n;
for(int i=0;i<n;i++){
ll x; scanf("%lld",&x);
if(x<=3){
printf("1\n");
}
else{
num={{{0,1,0},{0,0,1},{1,0,1}}};
ans={{{1,0,0},{0,1,0},{0,0,1}}};
pw(x-3);
ll res=(ans.a[2][0]+ans.a[2][1]+ans.a[2][2])%M;
printf("%d\n",res);
}
}
return 0;
}