Problem Description
众所周知,度度熊最近沉迷于 Pokémon GO。
今天它决定要抓住所有的精灵球!
为了不让度度熊失望,精灵球已经被事先放置在一个2*N的格子上,每一个格子上都有一个精灵球。度度熊可以选择任意一个格子开始游戏,抓捕格子上的精灵球,然后移动到一个相邻的至少有一个公共点的格子上继续抓捕。
例如,(2, 2) 的相邻格子有(1, 1), (2, 1) 和 (1, 2) 等等。
现在度度熊希望知道将所有精灵球都抓到并且步数最少的方案数目。
两个方案被认为是不同,当且仅当两个方案至少有一步所在的格子是不同的。
Input
第一行为T,表示输入数据组数。
每组数据包含一个数N。
●1≤T≤100
●1≤N≤10000
Output
对每组数据输出方案数目,结果对 1 000 000 007 取模。
 Sample Input
3
1
2
3
Sample Output
2
24
96
 

一道计数问题,重点就是要做到不重不漏.

怎样步数最短呢?当然是每个格子都只经过1次啦.

然后我们注意到如果这个起点选在中间的第i列,我们就把这个格子划分成了左右两个部分

感觉就是对于某个起点然后左右两部分是之前求过的答案直接相乘,不同起点再相加就可以了,但是关键问题是我们怎样计数呢?

我们设 Bn 代表从某个角(如左上角)出发,然后走遍所有格子回到同一列的方案数目。

同样,我们设 An 代表从某个角出发,然后走遍所有格子的方案数。

下面我们来解释这个式子

第一项表示从某个角开始最后回到起点的同一列的那个角

第二项表示从某个角开始,第二步走与起点相同列的那个角,第三步我们向第二列走的时候就有两种走法了(选择直接向右或者走对角线,乘的那个2)

从第四步开始我们现在面对的问题就是

第三项中4可以看成2*2,

我们把前两列写成这个样子

1 2
3 4

第一个2代表走一个(1 2 3 4)和(1 4 3 2)有两种走法起点在第一列而终点在第二列

第二个2代表对于每一个到达第二列后第五步向第三列走的时候都有两种走法(向右或者走对角线)

从第六步开始时我们面对的问题就是

我们现在来考虑下正经问题

首先有4个角,那么ans先加上

但是如果我们起点选在中间呢?

假设我们选在了第i列,首先这一列有两个格子 所以先乘个2

现在我们可以选择先往左跑,我们可以直接向左,也可以走一个向左的对角线.再乘个2

注意往左跑完1~i-1列以后一点要跑到第i列那个"不是起点的点"否则没法往右跑,所以乘的是

现在我们又回到了第i列,现在我们向右跑,又有两种情况,直接向右,向右的对角线 再乘个2

现在我们到了i+1列对于右半部分(i+1~n)我们只要跑完就行了,我们不关心终点所以乘

这样一开始向左跑就是,一开始向右跑自然是

 #include <bits/stdc++.h>

 using namespace std;
typedef long long ll;
const int maxn = ;
const ll mod = 1e9+;
ll a[maxn],b[maxn];
void init()
{
b[]=;
for (int i=;i<maxn;++i){
b[i] = (b[i-]*)%mod;
}
a[] = ;
a[] = ;
for (int i=;i<maxn;++i)
a[i] = (b[i]%mod+(*a[i-]%mod)+(*a[i-])%mod)%mod;
}
int n;
int main()
{
init();
int T;
scanf("%d",&T);
while (T--){
scanf("%d",&n);
if (n==){
printf("%d\n",);
}
else{
ll ans = ;
ans = (a[n]*)%mod;
for (int i=;i<n;++i){
ans = (ans+*( ( ( (*b[i-])%mod) *( (*a[n-i])%mod ) + ( (*a[i-])%mod) *( (*b[n-i])%mod ) )%mod )%mod)%mod;
}
printf("%lld\n",ans);
}
}
return ;
}

hdu 6146 Pokémon GO (计数)的更多相关文章

  1. HDU 6146 Pokémon GO DP,计数

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6146 题意:~ 解法:原题..http://blog.csdn.net/y990041769/arti ...

  2. 2017"百度之星"程序设计大赛 - 复赛1003&&HDU 6146 Pokémon GO【数学,递推,dp】

    Pokémon GO Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. 【HDU】6146 Pokémon GO

    [题意]一个2*n的网格,再保证步数最少的情况下,求从任意格出发遍历完所有格的方案数,格子八连通.n<=10000,T<=100. [算法]递推,DP [题解]原题链接:蓝桥杯 格子刷油漆 ...

  4. [ACM] hdu 3923 Invoker (Poyla计数,高速幂运算,扩展欧几里得或费马小定理)

    Invoker Problem Description On of Vance's favourite hero is Invoker, Kael. As many people knows Kael ...

  5. HDU - 4305 - Lightning 生成树计数 + 叉积判断三点共线

    HDU - 4305 题意: 比较裸的一道生成树计数问题,构造Krichhoof矩阵,求解行列式即可.但是这道题还有一个限制,就是给定的坐标中,两点连线中不能有其他的点,否则这两点就不能连接.枚举点, ...

  6. hdu 3908 Triple(组合计数、容斥原理)

    Triple Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others) Total Su ...

  7. hdu 6093---Rikka with Number(计数)

    题目链接 Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, s ...

  8. B - Cube HDU - 1220 (数学计数)

    题意:一个边长为N的正方体,切割成N*N*N个单位正方体,问有多少对正方体之间有0个,2个公共点. 思路:因为正方体之间出现公共点的情况有0,2,4. 那么直接正面求,肯定不好求,那么先求出有4个公共 ...

  9. HDU 4055 Number String (计数DP)

    题意:由数字1到n组成的所有排列中,问满足题目所给的n-1个字符的排列有多少个,如果第i字符是‘I’表示排列中的第i-1个数是小于第i个数的. 如果是‘D’,则反之. 析:dp[i][j] 表示前 i ...

随机推荐

  1. 软件-JMeter:JMeter 百科

    ylbtech-软件-JMeter:JMeter 百科 Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到 ...

  2. 安卓中如何调用jni

    ##指针和数组之间的关系 * 数组名就是数组元素的首地址 * 数组是一块连续的内存空间,每个元素之间的距离跟数据的类型有关 * 数组名字取地址,得到的还是数组的首地址 * arr[i]  ==  *( ...

  3. hdu2602Bone Collector ——动态规划(0/1背包问题)

    Problem Description Many years ago , in Teddy’s hometown there was a man who was called “Bone Collec ...

  4. python math 模块

    数学模块 引入模块:import math 注意: 使用某个模块下的函数,必须先引入这个模块,否则无法正常使用. ceil() 向上取整操作 格式:math.ceil(数值) 返回值:整型 floor ...

  5. Postman初接触

    https://www.getpostman.com/docs/postman/launching_postman/installation_and_updates

  6. JavaScript高级程序设计(第3版) 第三章 (基本概念)

    3.1 语法 1.不以数字开头的数字,字母,下划线,美元符号 2.注释:html <!-- --> css/**/ js单行// 多行/**/ 3.ES5 引入了严格模式(strict m ...

  7. Macaca的Python的api整理

    整理了下Macaca的API,做成思维脑图,方便阅览. WebDriver 安装 pip install wd git clone https://github.com/macacajs/wd.py. ...

  8. Aria2+WebUI+caddy搭建私有网盘

    Aria2安装 wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/ar ...

  9. 次小生成树(Prim + Kruaskal)

    问题引入: 我们先来回想一下生成树是如何定义的,生成树就是用n - 1条边将图中的所有n个顶点都连通为一个连通分量,这样的边连成子树称为生成树. 最小生成树很明显就是生成树中权值最小的生成树,那么我们 ...

  10. 59-python基础-python3-集合-集合常用方法-判断一个集合是否是另一个集合的子集-issubset()-issuperset()

    判断一个集合是否是另一个集合的子集-issubset()-issuperset() 1-issubset() s1.issubset(s) 判断s1是否是s的子集 2-issuperset() 与is ...