码迷,mamicode.com
首页 > 其他好文 > 详细

【HNOI模拟By YMD】move

时间:2016-04-03 22:11:00      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:

Description

设P(n)为从(0,0)移动到点(n,0)的不同路径数目,移动的方式有以下三种:(x,y)->(x+1,y-1),(x,y)->(x+1,y),(x+y)->(x+1,y+1),并且路径不能和第四象限有交集。求P(n),并对10^9+7取模。

Input

第一行一个整数T,表示数据组数。

对于每组数据,一行一个整数n。

Output

对于每组数据,输出答案。

Data Range

20%:n≤10;
50%:n≤10000;
100%:n≤106,T≤10。

 

Solution

20%  

直接O(3^n*n)的暴力枚举即可。

 

50%

考虑第一次直线y=0的点,假设是(i,0)。

那么从(1,1)到(i-1,1)之间的路径均在直线y=1的上方,显然有P(i-2)种。同理,从(x,0)到(n,0)之间的路径均在直线y=0的上方,有P(n-i)种。

所以,全部合起来可以得到P(n)=Σni=1 P(i-2)P(n-i),其中,规定P(-1)=P(0)=1。

其实可以在20%基础上打个表,考场有超过5人这样写。。。

 

100%

假设移动的路径中一共有i个(x,y)->(x+1,y+1),那么就一定会有i个(x,y)->(x+1,y-1),n-2i个(x,y)->(x+1,y)。

而如果不考虑所有的(x,y)->(x+1,y),那么路径的种数就是第i个Catalan数,设为C_i。如果加入(x,y)->(x+1,y),也就是在2i+1个空处中插入n-2i相同的球,方案数是C2in

所以,P(n)=Σni=1 C_i C2in

 

 

#include<algorithm>

#include<iostream>

#include<cstdlib>

#include<cstring>

#include<cstdio>

#include<cmath>

using namespace std;

 

typedef long long LL;

 

#define N 1000010

#define MOD 1000000007

 

int t;

int n;

 

LL f[N],d[N];

 

inline LL qpow(LL a,LL b)

{

 

LL ans=1;

while (b)

{

if (b&1)

ans=(1LL*ans*a)%MOD;

b>>=1;

a=(1LL*a*a)%MOD;

}

return ans;

}

 

inline LL C(LL x,LL y)

{

return f[x]*d[y]%MOD*d[x-y]%MOD;

}

 

inline LL Catalan(LL x)

{

return (C(x<<1,x)-C(x<<1,x-1)+MOD)%MOD;

}

 

int main()

{

freopen("move.in","r",stdin);freopen("move.out","w",stdout);

scanf("%d",&t);

f[0]=1;

for (int i=1;i<=1000000;i++)

f[i]=f[i-1]*i%MOD;

for (int i=0;i<=1000000;i++)

d[i]=qpow(f[i],MOD-2)%MOD;

while (t--)

{

scanf("%d",&n);

LL ans=0;

for (int i=0;i<=n;i+=2)

ans+=C(n,i)*Catalan(i>>1),ans%=MOD;

printf("%lld\n",ans);

}

return 0;

}

 

2.1 20%
†O(3n n)åqÞ=Œ"
2.2 50%
•Ä1˜g†‚y = 0:§b´(i,0)"
@ol(1,1)(i 1,1)ƒm´»þ3†‚y = 1þ•§w,kP(i
2)«"Ón§l(x,0)(n,0)ƒm´»þ3†‚y = 0þ•§kP(n
i)«"
¤±§ÜÜå5Œ±P(n) = Pn i=1 P(i 2)P(n i)§Ù¥§5
½P(1) = P(0) = 1"
2.3 100%
b£Ä´»¥˜ki(x, y)> (x + 1, y + 1)§@oÒ˜½¬
ki(x, y)> (x + 1, y 1)§n 2i(x, y)> (x + 1, y)"
XJؕĤk(x, y)> (x + 1, y)§@o´»«êÒ´
1iCatalan꧕Ci"XJ\\(x, y)> (x + 1, y)§•Ò´32i + 1
˜?¥\n 2iƒÓ¥§•Yê´C2i
n "
¤±§P(n) = Pn i=1 CiCn 2i"

【HNOI模拟By YMD】move

标签:

原文地址:http://www.cnblogs.com/yangjiyuan/p/5350633.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!