hdu5673 Robot

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5673

题目大意:一个机器人,可以向左,向右或停在当前位置每个动作都话费n个时间,但不能移动到原点左面,问n个时间后仍在原点位置有多少种走法。

解题思路:开始乱搞了一通,后来看的题解,枚举robot向左走的步数,同时它向右走的步数是一样的因为要回到原点,所以对于每一种情况,向左走i步,有Cn​2i​​ 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;
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值