ITX351 要铺一条 2 × N 2 \times N 2×N的路,为此他购买了 N块 2 × 1 2 \times 1 2×1的方砖。可是其中一块砖在运送的过程中从中间裂开了,变成了两块 1 × 1 1 \times 1 1×1的砖块!
ITX351 由此产生了一个邪恶的想法:他想要在这条路上故意把两块 1 × 1 1 \times 1 1×1的砖块分开铺,不让两块砖有相邻的边,其他砖块可以随意铺,直到整条路铺满。这样一定可以逼死自身强迫症 sea5!
也许下面的剧情你已经猜到了——他为此兴奋不已,以至于无法敲键盘。于是,他请你帮忙计算一下,有多少种方案可以让自己的阴谋得逞。
每个测试点包含多组数据,输入文件的第一行是一个正整数 T,表示数据的组数。注意各组数据之间是独立无关的。
接下来 T 行,每行包含一个正整数 N,代表一组数据中路的长度。
输出应包含 T行,对于每组数据,输出一个正整数,表示满足条件的方案数。
由于答案可能非常的大,你只需要输出答案对 1000000007 ( 1 0 9 10^{9} 109 + 7) 取模后的结果。
\text{ \ \ \\ \\ \\ \ \ \ \ \ \ \ \ \\ \ \ \ }
\text{ \ \ \\ \\ \\ \ \ \ \ \ \ \ \ \\ \ \ \ }
\text{ \ \ \\ \\ \\ \ \ \ \ \ \ \ \ \\ \ \ \ }
多组数据 ( T ≤ 500 ) (T≤500) (T≤500),用 2 × 1 2 \times 1 2×1 的方砖铺路,其中一块断裂成 2 2 2 块 1 × 1 1×1 1×1 的正方形方砖,求满 2 × N ( N ≤ 2 × 1 0 9 ) 2 \times N (N≤2×10^9) 2×N(N≤2×109)的道路 且 2 2 2 块正方形方砖不相邻的方案数。
\text{ \ \ \\ \\ \\ \ \ \ \ \ \ \ \ \\ \ \ \ }
\text{ \ \ \\ \\ \\ \ \ \ \ \ \ \ \ \\ \ \ \ }
\text{ \ \ \\ \\ \\ \ \ \ \ \ \ \ \ \\ \ \ \ }
\text{ \ \ \\ \\ \\ \ \ \ \ \ \ \ \ \\ \ \ \ }
其中 f ( 0 ) = 1 , f ( 1 ) = 1 , f ( 2 ) = 2 f(0)=1,f(1)=1,f(2)=2 f(0)=1,f(1)=1,f(2)=2
\text{ \ \ \\ \\ \\ \ \ \ \ \ \ \ \ \\ \ \ \ }
\text{ \ \ \\ \\ \\ \ \ \ \ \ \ \ \ \\ \ \ \ }
\text{ \ \ \\ \\ \\ \ \ \ \ \ \ \ \ \\ \ \ \ }
因为这种“含方块整体”的长度不定,且左右两边长度不定
拆成几种好计算的,能覆盖所有情况的
一般就是分为有和没有
有的人是最后一列是否有方块格
跟我最后一列是否有“含方块整体”差不多
都是为了利用到斐波那契的前缀和
\text{ \ \ \\ \\ \\ \ \ \ \ \ \ \ \ \\ \ \ \ }
\text{ \ \ \\ \\ \\ \ \ \ \ \ \ \ \ \\ \ \ \ }
\text{ \ \ \\ \\ \\ \ \ \ \ \ \ \ \ \\ \ \ \ }
\text{ \ \ \\ \\ \\ \ \ \ \ \ \ \ \ \\ \ \ \ }
注意到我这里的斐波那契虽然是从下标0开始的,但是性质是不变的 ; 后者是斐波那契的性质,读者请自行查询
\text{ \ \ \ \ \ \ \ \ \ \ \ }
\text{ \ \ \ \ \ \ \ \ \ \ \ }
⎡ 1 1 2 0 − 2 ⎢ ⎡ A n s ( i − 1 ) ⎢ ⎡ A n s ( i ) ⎢ ⎡ \text{ \ \ } 1\text{ \ \ } 1\text{ \ \ } 2\text{ \ \ } 0\text{ } -2 ⎢\text{ \ \ \ \ \ \ \ \ \ \ \ } ⎡Ans(i-1)⎢ \text{ \ \ \ \ \ \ \ \ \ \ \ } ⎡ \text{ \ \ }Ans(i)\text{ \ \ } ⎢ ⎡ 1 1 2 0 −2⎢ ⎡Ans(i−1)⎢ ⎡ Ans(i) ⎢
⎢ 1 0 0 0 0 ⎢ ⎢ A n s ( i − 2 ) ⎢ ⎢ A n s ( i − 1 ) ⎢ ⎢\text{ \ \ } 1\text{ \ \ } 0\text{ \ \ } 0\text{ \ \ } 0\text{ \ \ } 0\text{ \ \ } ⎢ \text{ \ \ \ \ \ \ \ \ \ \ \ } ⎢ Ans(i-2)⎢ \text{ \ \ \ \ \ \ \ \ \ \ \ } ⎢Ans(i-1) ⎢ ⎢ 1 0 0 0 0 ⎢ ⎢Ans(i−2)⎢ ⎢Ans(i−1)⎢
⎢ 0 0 1 1 0 ⎢ × ⎢ f ( i − 1 ) ⎢ = ⎢ f ( i ) ⎢ ⎢\text{ \ \ } 0\text{ \ \ } 0\text{ \ \ } 1\text{ \ \ } 1\text{ \ \ } 0\text{ \ \ } ⎢\text{ \ \\ \ }\times \text{ \ \ \ } ⎢\text{ \ } f(i-1)\text{ \ } ⎢ \text{ \ \\ \ }= \text{ \ \ } ⎢\text{ \ \ \ \ } f(i)\text{ \ \ \ \ \ } ⎢ ⎢ 0 0 1 1 0 ⎢ × ⎢ f(i−1) ⎢ = ⎢ f(i) ⎢
⎢ 0 0 1 0 0 ⎢ ⎢ f ( i − 2 ) ⎢ ⎢ f ( i − 1 ) ⎢ ⎢ \text{ \ \ } 0\text{ \ \ } 0\text{ \ \ } 1\text{ \ \ } 0\text{ \ \ } 0\text{ \ \ } ⎢\text{ \ \ \ \ \ \ \ \ \ \ \ } ⎢\text{ \ } f(i-2)\text{ \ }⎢ \text{ \ \ \ \ \ \ \ \ \ \ \ } ⎢\text{ \ } f(i-1)\text{ \ \ } ⎢ ⎢ 0 0 1 0 0 ⎢ ⎢ f(i−2) ⎢ ⎢ f(i−1) ⎢
⎡ 0 0 0 0 1 ⎢ ⎣ 1 ⎦ ⎢ 1 ⎦ ⎡ \text{ \ \ } 0\text{ \ \ } 0\text{ \ \ } 0\text{ \ \ } 0\text{ \ \ } 1\text{ \ \ } ⎢\text{ \ \ \ \ \ \ \ \ \ \ } ⎣\text{ \ \\ \ \ \ \ \ \ } 1\text{ \ \ \ \ \ \ } ⎦ \text{ \ \ \ \ \ \ \ \ \ \ \ } ⎢\text{ \ \\ \ \ \ \ } 1\text{ \ \ \ \\ \ \ } ⎦ ⎡ 0 0 0 0 1 ⎢ ⎣ 1 ⎦ ⎢ 1 ⎦.
⎡ A n s ( 1 ) = 0 ⎢ ⎡Ans(1)=0⎢ \text{ \ \ \ \ \ \ \ \ \ \ \ } ⎡Ans(1)=0⎢
⎢ A n s ( 0 ) = 0 ⎢ ⎢Ans(0)=0⎢ \text{ \ \ \ \ \ \ \ \ \ \ \ } ⎢Ans(0)=0⎢
⎢ f ( 1 ) = 1 ⎢ ⎢\text{ \ } f(1)=1\text{ \ } ⎢\text{ \ \\ \ } ⎢ f(1)=1 ⎢
⎢ f ( 0 ) = 1 ⎢ ⎢\text{ \ } f(0)=1\text{ \ } ⎢\text{ \ \ \ \ \ \ \ \ \ \ \ } ⎢ f(0)=1 ⎢
⎣ 1 ⎦ ⎣\text{ \ \\ \ \ \ \ \ \ } 1\text{ \ \ \ \ \ \ \ } ⎦ ⎣ 1 ⎦ \text{ \ \ \ \ \ \ \ }
⎡ 1 0 0 0 0 ⎢ ⎡ \text{ \ \ } 1\text{ \ \ } 0\text{ \ \ } 0\text{ \ \ } 0\text{ \ \ } 0 \text{\ \ }⎢ ⎡ 1 0 0 0 0 ⎢
⎢ 0 1 0 0 0 ⎢ ⎢\text{ \ \ } 0\text{ \ \ } 1\text{ \ \ } 0\text{ \ \ } 0\text{ \ \ } 0\text{ \ \ } ⎢ ⎢ 0 1 0 0 0 ⎢
⎢ 0 0 1 0 0 ⎢ ⎢\text{ \ \ } 0\text{ \ \ } 0\text{ \ \ } 1\text{ \ \ } 0\text{ \ \ } 0\text{ \ \ } ⎢ ⎢ 0 0 1 0 0 ⎢
⎢ 0 0 0 1 0 ⎢ ⎢ \text{ \ \ } 0\text{ \ \ } 0\text{ \ \ } 0\text{ \ \ } 1\text{ \ \ } 0\text{ \ \ } ⎢ ⎢ 0 0 0 1 0 ⎢
⎡ 0 0 0 0 1 ⎢ ⎡ \text{ \ \ } 0\text{ \ \ } 0\text{ \ \ } 0\text{ \ \ } 0\text{ \ \ } 1\text{ \ \ } ⎢ ⎡ 0 0 0 0 1 ⎢.
#include
#include
#define LL long long
const LL mod=1e9+7;
struct mat{
LL a[10][10];
mat(LL t=0){
memset(a,0,sizeof(a));
a[1][1]=a[2][2]=a[3][3]=a[4][4]=a[5][5]=t;
}
mat operator * (const mat &B){
mat C;
for(int i=1;i<=5;i++)
for(int j=1;j<=5;j++)
for(int k=1;k<=5;k++)
C.a[i][j]=(C.a[i][j]+a[i][k]*B.a[k][j]+mod)%mod;
return C;
}
}ma,st(0);
void init()
{
st.a[1][1]=st.a[2][1]=0; st.a[3][1]=st.a[4][1]=st.a[5][1]=1;
ma.a[1][1]=1 ,ma.a[1][2]=1 ,ma.a[1][3]=2 ,ma.a[1][4]=0 ,ma.a[1][5]=-2;
ma.a[2][1]=1 ,ma.a[2][2]=0 ,ma.a[2][3]=0 ,ma.a[2][4]=0 ,ma.a[2][5]=0;
ma.a[3][1]=0 ,ma.a[3][2]=0 ,ma.a[3][3]=1 ,ma.a[3][4]=1 ,ma.a[3][5]=0;
ma.a[4][1]=0 ,ma.a[4][2]=0 ,ma.a[4][3]=1 ,ma.a[4][4]=0 ,ma.a[4][5]=0;
ma.a[5][1]=0 ,ma.a[5][2]=0 ,ma.a[5][3]=0 ,ma.a[5][4]=0 ,ma.a[5][5]=1;
/* 1 1 2 0 -2
1 0 0 0 0
0 0 1 1 0
0 0 1 0 0
0 0 0 0 1*/
}
void ksm(LL p)
{
mat b=ma,ans(1);
while(p>0){
if(p%2==1) ans=ans*b;
b=b*b;p>>=1;
}/*
for(int i=1;i<=5;i++,printf("\n"))
for(int j=1;j<=5;j++) printf("%lld ",ans.a[i][j]);*/
ans=ans*st;
printf("%lld\n",ans.a[1][1]);
}
int main()
{
int T;LL n;init();
scanf("%d",&T);
while(T--){
scanf("%lld",&n);
ksm(n-1);
}
return 0;
}