题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5673
题目大意:一个机器人,可以向左,向右或停在当前位置每个动作都话费n个时间,但不能移动到原点左面,问n个时间后仍在原点位置有多少种走法。
解题思路:开始乱搞了一通,后来看的题解,枚举robot向左走的步数,同时它向右走的步数是一样的因为要回到原点,所以对于每一种情况,向左走i步,有Cn2i Catalan(i)
种情况,组合数为从n步中选出那几步走(向左或向右)的情况数,catalan数可以理解为当向左走时火车进站,向右走为出站。
/* ********************************
Author : danmu
Created Time : 2016年04月23日 星期六 10时03分50秒
File Name : hdu5673.cpp
Vim Command
copy -> yy
paste -> p P
del this line -> dd
Ctrl-Z -> u U
copy into system -> "+y
******************************** */
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <iomanip>
#include <string>
#include <vector>
#include <cstdio>
#include <stack>
#include <queue>
#include <cmath>
#include <list>
#include <map>
#include <set>
#define ULL unsigned long long
#define PI 3.1415926535
#define INF 0x3f3f3f3f
#define LL long long
#define eps 1e-8
#define mod 1000000007
#define MAX 1000010
using namespace std;
LL inv[MAX+5],C[MAX+5],cat[MAX+5];
void init(){
C[0]=1;
inv[1]=1;
for(int i=2;i<=MAX;++i)
inv[i]=(mod-mod/i)*inv[mod%i]%mod;
cat[0]=cat[1]=1;
for(int i=2;i<=500000;++i)
cat[i]=cat[i-1]*(4*i-2)%mod*inv[i+1]%mod;
}
int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
int t;
init();
scanf("%d",&t);
while(t--){
int n;
LL ans=0;
scanf("%d",&n);
for(int i=1;i<=n;++i)
C[i]=C[i-1]*(n-i+1)%mod*inv[i]%mod;
for(int i=0;i<=n/2;++i)
ans=(ans+cat[i]*C[i*2])%mod;
//printf("%lld %lld %lld \n",C[0],C[1],C[2]);
printf("%lld\n",ans);
}
return 0;
}