dp+矩阵快速幂
dp[i][1]表示一共有i个珠子,1表示以红色珠子结尾;dp[i][0],0表示以蓝色珠子结尾。
dp[i][1]=dp[i-1][0]+dp[i-1][1]
dp[i][0]=dp[i-2][1]
代码:
import java.util.*;
public class Main {
static long N=1000000007;
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
for(int i=0;i<n;i++) {
long x=sc.nextLong();
System.out.println(fastMul(x));
}
}
static long[][] mul(long[][] a,long[][] b) {
long[][] res=new long[a.length][b[0].length];
for(int i=0;i<a.length;i++)
for(int j=0;j<b[0].length;j++)
for(int k=0;k<b.length;k++)
res[i][j]=(res[i][j]+a[i][k]*b[k][j]%N)%N;
return res;
}
static long fastMul(long n) {
if(n==2)
return 3;
long[][] ans=new long[3][3];
long[][] base=new long[3][3];
ans[0][0]=ans[1][1]=ans[2][2]=1;
base[0][0]=base[0][1]=base[1][2]=base[2][0]=1;
n=n-2;
while(n>0) {
if(n%2==1)
ans=mul(ans,base);
base=mul(base,base);
n>>=1;
}
long[][] a=new long[3][1];
a[0][0]=2;
a[1][0]=1;
a[2][0]=1;
ans=mul(ans,a);
return (ans[0][0]+ans[1][0])%N;
}
}