【HNOI模拟By YMD】move

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´»«êÒ´
1i‡Catalan꧕Ci"XJ\\(x, y)> (x + 1, y)§•Ò´32i + 1‡
˜?¥\n 2iƒÓ¥§•Yê´C2i
n "
¤±§P(n) = Pn i=1 CiCn 2i"

时间: 2024-10-04 11:13:19

【HNOI模拟By YMD】move的相关文章

【HNOI模拟By lyp】Day1

1 xlk1.1 题目描述给定一棵大小为 n 的无根树,求满足以下条件的四元组 (a, b, c, d) 的个数:1. 1 ≤ a < b ≤ n2. 1 ≤ c < d ≤ n3. 不存在一个点,使得这个点同时在点 a 到点 b 的最短路和点 c 到点 d 的最短路上.1.2 输入格式第一行一个数 n .接下来 n − 1 行,每行两个数 s, t ,表示一条连接 a 和 b 的边.1.3 输出格式输出满足条件的四元组的个数.1.4 样例输入41 22 33 41.5 样例输出21.6 数据

【HNOI模拟By lyp】Day2

1 toad1.1 题目描述有 n 个石子, A B 两人博弈, A 先手. A 首先取若干个石子(至少一个,不能取完),然后 B 和A 再轮流取石子,每次取的石子不能超过 axb ( x 表示上次取的石子数, a, b 是两个正整数参数),且至少取一个,无法操作的人输.求 n 满足什么条件时先手必胜.1.2 输入格式第一行三个正整数 T, a, b , T 表示数据组数, a, b 意义见题.接下来 T 行,每行一个正整数 n .1.3 输出格式对于每个 n ,输出 A 或 B ,表示此时 A

Linux命令大全完整版

目    录 目    录 I 1. linux系统管理命令 1 adduser 1 chfn(change finger information) 1 chsh(change shell) 1 date 2 exit 3 finger 4 free 5 fwhois 5 gitps(gnu interactive tools process status) 5 groupdel(group delete) 6 groupmod(group modify) 6 halt 7 id 7 kill

Linux学习总结(1)——Linux命令大全完整版

Linux命令大全完整版 目    录I 1. linux系统管理命令1 adduser1 chfn(change finger information)1 chsh(change shell)1 date2 exit3 finger4 free5 fwhois5 gitps(gnu interactive tools process status)5 groupdel(group delete)6 groupmod(group modify)6 halt7 id7 kill8 last8 la

[转载]如何在C++03中模拟C++11的右值引用std::move特性

本文摘自: http://adamcavendish.is-programmer.com/posts/38190.htm 引言 众所周知,C++11 的新特性中有一个非常重要的特性,那就是 rvalue reference,右值引用. 引入它的一个非常重要的原因是因为在 C++ 中,常常右值,通俗地讲"在等号右边的"临时变量或者临时对象,我们是无法得到它的修改权限的. 由于类的构造和析构机制,往往产生的临时变量或临时对象的拷贝构造及析构,会带来不少的时间.资源消耗. 也同样由于这样的限

一款模拟CSS3动画的js插件-move.js

Move.js是一款简单小巧的模拟CSS3动画的js插件.该插件可以完成CSS3的各种动画效果:移动.变形.倾斜.背景色渐变.旋转等.并且可以在动画中使用各种easing效果. 类似插件可参考:可替代CSS3 transition和transform的jQuery插件. 在线演示:http://www.htmleaf.com/Demo/201501281292.html 下载地址:http://www.htmleaf.com/jQuery/Layout-Interface/20150128129

php+mysql 模拟队列发送邮件

1.使用场景 主要解决PHP开发过程中,常见的发送多封邮件时页面卡死的问题,如果需要给网站所有用户发送一封系统通知邮件,假设网站有10000个注册用户,发送每封邮件需要0.1秒,直接发送导致页面耗时长卡死,因此就要用到队列的知识. 2.建表语句 create table users ( user_id int(5) not null auto_increment, user_email varchar(40) not null, user_password char(32) not null,

使用OpenFiler来模拟存储配置RAC中ASM共享盘及多路径(multipath)的测试

第一章 本篇总览 之前发布了一篇<Oracle_lhr_RAC 12cR1安装>,但是其中的存储并没有使用多路径,而是使用了VMware自身提供的存储.所以,年前最后一件事就是把多路径学习一下,本文介绍了OpenFiler.iSCSI和多路径的配置. 本文内容:   第二章 安装OpenFiler OpenFile是在rPath Linux基础上开发的,它能够作为一个独立的Linux操作系统发行.Openfiler是一款非常好的存储管理操作系统,开源免费,通过web界面对存储磁盘的管理,支持现

PostgreSQL异步客户端(并模拟redis 数据结构)

以前为了不在游戏逻辑(对象属性)变更时修改数据库,就弄了个varchar字段来表示json,由服务器逻辑(读取到内存)去操作它. 但这对运维相当不友好,也不能做一些此Json数据里查询. 所以后面就用了下ssdb,然而就在前几天才了解到postgresql支持json了(其实早在两年前就行了吧···) 就这点差不多就可以算当作mongodb用了,不过还是不支持redis的高级数据结构. 于是我就想模拟(实现)下redis(的数据结构). 就抽空看了下它的c api库:libpq,发现其请求-等待