题目:http://acm.hdu.edu.cn/showproblem.php?pid=6146
思路:
设b[i]代表从某个角出发走遍所有格子回到同一列的方案数目
b[i] = b[i-1]*2 = 2^(n-1)
设a[i]代表从某个角出发走遍所有格子的方案数目
a[i] = b[i] + 2*a[i-1] + 4*a[i-2]
所以对于第i列,总数为4*(2*b[i-1]*a[n-i] + 2*b[n-i]*a[i-1])
代码:
#include<bits/stdc++.h>
using namespace std;
const int MOD = 1e9+7;
const int N = 10005;
long long a[N],b[N];
void Init()
{
b[1] = 1;
a[1] = 1;
a[2] = 6;
for(int i = 2;i < N;i++)
b[i] = b[i-1]*2%MOD;
for(int i = 3;i < N;i++)
a[i] = (2*a[i-1] + b[i] + 4*a[i-2])%MOD;
}
int main()
{
Init();
int n;
while(~scanf("%d",&n)){
if(n == 1)
printf("2\n");
else
{
long long sum = a[n]*4;
for(int i = 2;i < n;i++)
sum = (sum + 4*(2*b[i-1]*a[n-i]%MOD + 2*b[n-i]*a[i-1]%MOD)%MOD )%MOD;
printf("%lld\n",sum);
}
}
}