HDU6146 Pokémon GO (2017百度之星程序设计大赛

来源:互联网 发布:php特殊字符转义函数 编辑:程序博客网 时间:2024/05/18 03:57

递推

题目传送门

分两种情况处理递推式:
① 设b[i]为从四个角中任意一个角出发,走完所有格子后回到该列的方案数。
显然b[i]=2i1
② 设a[i]为从四个角中任意一个角出发走完所有格子的方案数(不需回到该列)
于是a[i]=b[i]+2a[i1]+4a[i2]

总方案数即为2(4a[i1]b[ni]+4a[ni]b[i1])

记得多模几次,然后要开long long。

代码:

#include<cstdio>#include<cstring>#include<algorithm>#define MAXN 100005#define MOD 1000000007using 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;}