递推
分两种情况处理递推式:
① 设b[i]为从四个角中任意一个角出发,走完所有格子后回到该列的方案数。
显然
b[i]=2i−1
。
② 设a[i]为从四个角中任意一个角出发走完所有格子的方案数(不需回到该列)
于是
a[i]=b[i]+2∗a[i−1]+4∗a[i−2]
。
总方案数即为 2∗(4∗a[i−1]∗b[n−i]+4∗a[n−i]∗b[i−1]) 。
记得多模几次,然后要开long long。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 100005
#define MOD 1000000007
using namespace std;
long long a[MAXN+5],b[MAXN+5];
int t;
void prepare(){
b[1]=1;
b[2]=2;
for (int i=3;i<MAXN;i++)
b[i]=(b[i-1]*2)%MOD;
a[1]=1;
a[2]=6;
for (int i=3;i<MAXN;i++)
a[i]=(a[i-1]*2+b[i]+a[i-2]*4)%MOD;
}
int main(){
scanf("%d",&t);
prepare();
while (t--){
int x;
scanf("%d",&x);
if (x==1){
printf("2\n");
continue;
}
long long sum=(a[x]*4)%MOD;
for (int i=2;i<x;i++)
sum=(sum+((b[i-1]*a[x-i]%MOD*8)%MOD+(b[x-i]*8%MOD*a[i-1])%MOD)%MOD)%MOD;
printf("%lld\n",sum);
}
return 0;
}