hdu 5184 卡特兰数

hdu 5184 卡特兰数

题意:

我们给出下列递归的合法括号序列的定义:

1. 空序列是合法括号序列

2. 如果s是一个合法括号序列,那么(s)也是合法括号序列

3. 如果a和b是合法括号序列,那么ab也是合法括号序列

4. 没有其它情况是合法括号序列

比如下列括号序列是合法括号序列

(), (()), ()(), ()(())

下列括号序列则不是

(, ), )(, ((), ((()

现在,我们要构造长度为n的合法括号序列,前面的一些括号已经给出,问可以构造出多少合法序列。

限制:

1 <= n <= 1e6

思路:

先求出剩余的左括号a个,右括号b个

然后ans=C(a+b,a)-C(a+b,a-1)

证明:

我们先看看一个卡特兰数的经典模型:

有n个1和m个-1(n>=m),共n+m个数排成一列,满足对所有0<=k<=n+m的前k个数的部分和Sk >= 0的排列数。(和问题1不同之处在于此处部分和可以为0,这也是更常见的情况) 问题等价为在一个格点阵列中,从(0,0)点走到(n,m)点且不穿过对角线x==y的方法数(可以走到x==y的点)。

把(n,m)点变换到(n+1,m)点,问题变成了问题1。

方法数为:

((n+m+1, m)) - 2*((n+m+1-1, m-1))

或:((n+m+1-1, m)) - ((n+m+1-1, m-1))

我们从后往前看,然后‘)‘就可以当作1,‘(‘可以当作-1,就可以了。

时间: 2024-10-01 03:02:54

hdu 5184 卡特兰数的相关文章

2014年百度之星程序设计大赛 - 初赛(第一轮) hdu Grids (卡特兰数 大数除法取余 扩展gcd)

题目链接 分析:打表以后就能发现时卡特兰数, 但是有除法取余. f[i] = f[i-1]*(4*i - 2)/(i+1); 看了一下网上的题解,照着题解写了下面的代码,不过还是不明白,为什么用扩展gcd, 不是用逆元吗.. 网上还有别人的解释,没看懂,贴一下: (a / b) % m = ( a % (m*b)) / b 笔者注:鉴于ACM题目特别喜欢M=1000000007,为质数: 当gcd(b,m) = 1, 有性质: (a/b)%m = (a*b^-1)%m, 其中b^-1是b模m的逆

HDU 4828 (卡特兰数+逆元)

HDU 4828 Grids 思路:可以转化为卡特兰数,先把前n个人标为0,后n个人标为1,然后去全排列,全排列的数列,如果每个1的前面对应的0大于等于1,那么就是满足的序列,如果把0看成入栈,1看成出栈,那么就等价于n个元素入栈出栈,求符合条件的出栈序列,这个就是卡特兰数了.然后去递推一下解,过程中需要求逆元去计算 代码: #include <stdio.h> #include <string.h> const int N = 1000005; const long long M

HDU 4828 (卡特兰数+逆)

HDU 4828 Grids 思路:能够转化为卡特兰数,先把前n个人标为0.后n个人标为1.然后去全排列,全排列的数列.假设每一个1的前面相应的0大于等于1,那么就是满足的序列,假设把0看成入栈,1看成出栈.那么就等价于n个元素入栈出栈,求符合条件的出栈序列,这个就是卡特兰数了. 然后去递推一下解,过程中须要求逆元去计算 代码: #include <stdio.h> #include <string.h> const int N = 1000005; const long long

Train Problem II HDU 1023 卡特兰数

Problem Description As we all know the Train Problem I, the boss of the Ignatius Train Station want to know if all the trains come in strict-increasing order, how many orders that all the trains can get out of the railway. Input The input contains se

hdu 1023 卡特兰数+高精度

Train Problem II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Description As we all know the Train Problem I, the boss of the Ignatius Train Station want to know if all the trains come in strict-increasi

hdu 1130(卡特兰数,大数)

How Many Trees? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3382    Accepted Submission(s): 1960 Problem Description A binary search tree is a binary tree with root k such that any node v re

hdu 1023 卡特兰数

import java.math.BigInteger; import java.util.Scanner; public class Main{ public static void main(String args[]){ Scanner in = new Scanner(System.in); BigInteger[] a = new BigInteger[105]; for(int i = 0;i < 105;i++){ a[i] = new BigInteger("1"

组合数学--卡特兰数-持续更新

参考资料: 基本介绍和各种分类 http://www.cnblogs.com/topW2W/p/5410875.html 另类递归式: h(n)=h(n-1)*(4*n-2)/(n+1);  (从n开始,更常用) 前几个卡特兰数:规定C0=1,而 分类 :  括号,栈,矩阵乘法,     凸多边形划分,二叉搜索树构造      步数上下,找零, C1=1,C2=2,C3=5,C4=14,C5=42, C6=132,C7=429,C8=1430,C9=4862,C10=16796, C11=587

hdu 5184 类卡特兰数+逆元

BC # 32 1003 题意:定义了括号的合法排列方式,给出一个排列的前一段,问能组成多少种合法的排列. 这道题和鹏神研究卡特兰数的推导和在这题中的结论式的推导: 首先就是如何理解从题意演变到卡特兰数: 排列的总长度为 n ,左右括号各为 m = n / 2 个.当给定的排列方式完全合法的时候,剩下需要排列的左右括号的数量就已经确定了,而在排列的过程中,左括号要始终大于等于右括号的数量.设现在有 a 个左括号, b 个右括号,那么这个就可以当做从( a , b )点到 ( m , m )点且不