HDU 6146:Pokémon GO
HDU 6146:Pokémon GO
题目
Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
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
题解
这是一个规律题首先,我们可以知道步数最少即为遍历每一个格子然后我们从顶点入手首先我们先画一个2*N的格子图,我们设2*N的方格四个角上的格子所能走的方案数为f[n],然后以左上角的格子为起点(因为四个角上所走的方案数是相等的)我们会发现我们开始有三个选择:① 先向下走,然后我们会发现我们可以走到一个2*N-1的方格的两个角上中的一个,即有2*f[n-1]种走法;② 先向右走,然后我们有两个选择:① 向左下的格子走,然后只能想右走,然后我们发现我们可以走到一个2*N-2的方格的两个角上中的一个,即有2*f[n-2]种走法;② 向右边的两个格子走,因为还有下面和右下的格子没走,所以走法之有2^n-2种;③ 先向右下走,然后我们又有两个选择:① 向左的格子走,然后只能想右上走,然后我们发现我们可以走到一个2*N-2的方格的两个角上中的一个,即有2*f[n-2]种走法;② 向右边的两个格子走,因为还有左边和上面的格子没走,所以走法之有2^n-2种;所以顶点的方案数的规律就是f[n]=2*f[n-1]+4*f[n-2]+2^n-1接下来我们找边界上的点的规律我们假设以i(1<i<n)这一列的上面的格子为起点,我们会发现有两种选择① 向左边走,由于下面的点还需要遍历,所以有2^i-1种方案会到达下面的点,然后我们又会发现右边有一个2*n-i的方格的两个角上中的一个,即有2*f[n-i]种走法;② 向右边走,由于下面的点还需要遍历,所以有2^n-i种方案会到达下面的点,然后我们又会发现左边有一个2*i-1的方格的两个角上中的一个,即有2*f[i-1]种走法;所以边界的点的方案数的规律就是2*(f[n-i]*2^i-1+f[i-1]*2^n-1)由此,我们只需要将没个点的方案数加在一起就是答案(写了好长。。。手有点小累。。。)
代码
#include<cstdio>
#define tt 1000000007
using namespace std;int t,n;
long long ans,f[10005],g[10005];int main()
{scanf("%d",&t);f[1]=1;f[2]=6;g[1]=2;g[2]=4;for (int i=3;i<=10005;i++){g[i]=(g[i-1]*2)%tt;f[i]=((f[i-1]*2)%tt+g[i-1]%tt+4*f[i-2])%tt;}while (t--){scanf("%d",&n);if (n==1) ans=2;else ans=4*f[n];for (int i=2;i<=n-1;i++)ans=(ans+(4*((g[n-i]*f[i-1])%tt+(g[i-1]*f[n-i])%tt)%tt)%tt)%tt;printf("%lld\n",ans);}
}
HDU 6146:Pokémon GO相关推荐
- HDU 3507:Print Article
HDU 3507:Print Article 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3507 题目大意:给定$n$,$m$,输出序列$n$个数, ...
- Java算法_优先队列和PriorityQueue——HDU 1873:看病要排队
目录 优先队列和PriorityQueue HDU 1873:看病要排队 java.util.Comparator 优先队列和PriorityQueue java.util.PriorityQueue ...
- HDU 1498:50 years, 50 colors(二分图匹配)
http://acm.hdu.edu.cn/showproblem.php?pid=1498 题意:给出一个 n*n 的矩阵,里面的数字代表一种颜色,每次能炸掉一排或者一列的相同颜色的气球,问有哪些颜 ...
- HDU 4283:You Are the One(区间DP)
http://acm.hdu.edu.cn/showproblem.php?pid=4283 题意:有n个数字,不操作的情况下从左到右按顺序输出,但是可以先让前面的数字进栈,让后面的数字输出,然后栈里 ...
- HDU 2444:The Accomodation of Students(二分图判定+匹配)
http://acm.hdu.edu.cn/showproblem.php?pid=2444 题意:给出边,判断这个是否是一个二分图,并求最大匹配. 思路:先染色法求出是否是一个二分图,然后再匈牙利求 ...
- 图文直播:Pokémon Go真爱粉与“脑残粉”之间的爱恨情仇
世界上分为两种人,Pokémon Go玩家和普通游戏玩家. 近来,一款由日本电子游戏业巨头任天堂和美国软件开发公司Niantic联合开发的智能手机游戏"口袋妖怪Go",又名&quo ...
- HDU 5025:Saving Tang Monk(BFS + 状压)
http://acm.hdu.edu.cn/showproblem.php?pid=5025 Saving Tang Monk Problem Description <Journey to t ...
- HDU 5794:A Simple Chess(Lucas + DP)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5794 题意:让一个棋子从(1,1)走到(n,m),要求像马一样走日字型并只能往右下角走.里 ...
- HDU 1827:Summer Holiday(强连通)
http://acm.hdu.edu.cn/showproblem.php?pid=1827 思路:强连通分量缩点后找入度为0的点,然后对于属于该强连通分量的找一个最小耗费的入口. 1 #includ ...
最新文章
- android 正则表达式3,含有至少3个字符类型的android正则表达式
- python项目归纳总结-【第108期】总结最近项目中常用的几个Python库
- java 与 .net socket_java.net.Socket/java.net.ServerSocket-TCP Socket编程
- 机器学习导论(张志华):主元分析
- ios不行安卓可以 微信签名_王者荣耀安卓、iOS互通来了!现在可以互看好友资料...
- nodejs 创建一个静态资源服务器 +路由
- matlab控制realsense,RealSense开发学习--1.初识RealSense
- vue获取当前时间和前一天时间_vue获取当前时间并实时刷新时间
- 基于消息队列的UDP并发服务器v1
- 如何列出所有用户的所有cron作业?
- 极简算法 —— 判断两字符串是否为相同字母的不同顺序组成
- 牛客小白月赛9: F. 暴力出奇迹(思维题)
- priority_queue 优先队列 hdu裸题。
- [转]程序员能力矩阵
- WINDOWS PHONE死于自己不兼容
- 电脑热点突然不能用了,想想你是否新装了VMware等软件
- 脉冲云中使用的ajv
- KSP RSS bonk 希望各大大佬幫助一下
- 浅谈Linux USB设备驱动
- 小马智行与速腾聚创展开全面战略合作