【递推+乱搞】HDU6146 Pokémon GO

来源:互联网 发布:网络教育学校有区别吗 编辑:程序博客网 时间:2024/06/07 17:01

题面在这里

要使步数最少,则每个格子只走一次
定义Ai表示2×i的矩阵,从某个角落出发遍历整个矩阵的方案数
Bi表示2×i的矩阵,从某个角落出发遍历整个矩阵,并回到出发的那列的方案数

显然有:

Bi=2i1

Ai=Bi+2Ai1+4Ai2

然后如果从角落出发,答案是4An
枚举在哪一列出发,对答案的贡献是8×(Ai1Bni+Bi1Ani)

示例程序:

#include<cstdio>#define LL long longconst int maxn=10005,tt=1000000007;int tst,n;LL a[maxn],b[maxn];int main(){    n=10000;b[1]=1;a[1]=1;a[2]=6;    for (int i=2;i<=n;i++) b[i]=b[i-1]*2%tt;    for (int i=3;i<=n;i++) a[i]=(b[i]+a[i-1]*2+a[i-2]*4)%tt;    scanf("%d",&tst);    while (tst--){        scanf("%d",&n);        if (n==1) {printf("2\n");continue;}        LL ans=a[n]*4%tt;        for (int i=2;i<n;i++) ans=(ans+8*(a[i-1]*b[n-i]%tt + b[i-1]*a[n-i]%tt))%tt;        printf("%lld\n",ans);    }    return 0;}