嘿嘿嘿…….矩阵乘法!!
https://yunpan.cn/cvxtdIUiCITNk 访问密码 38b3
细细~具体就是看PPT反正不是我写的~
OJ
【题目描述】
a[1]=a[2]=a[3]=1
a[x]=a[x-3]+a[x-1] (x>3)
求a数列的第n项对1000000007(10^9+7)取余的值。
【输入格式】
第一行一个整数T,表示询问个数。
以下T行,每行一个正整数n。
【输出格式】
每行输出一个非负整数表示答案。
【样例输入】
3
6
8
10
【样例输出】
4
9
19
【数据范围】
对于30%的数据 n<=100;
对于60%的数据 n<=2*10^7;
对于100%的数据 T<=100,n<=2*10^9;
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
int n,mod=1000000007;
struct node{
long long a[4][4];
node(){
memset(a,0,sizeof(a));
}
};
node chengfa(node a,node b) {
node c;
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
for(int k=1;k<=3;k++){
c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j])%mod;
}
}
}
return c;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
node ans,A;
ans.a[1][1]=1;ans.a[2][1]=1;ans.a[3][1]=1;
A.a[1][1]=0;A.a[1][2]=0;A.a[1][3]=1;
A.a[2][1]=1;A.a[2][2]=0;A.a[2][3]=0;
A.a[3][1]=0;A.a[3][2]=1;A.a[3][3]=1;
while(n>0){
if(n%2==1)ans=chengfa(ans,A);
A=chengfa(A,A);
n/=2;
}
printf("%d\n",ans.a[3][3]%mod);
}
}