BC # 32 1003

题意:定义了括号的合法排列方式,给出一个排列的前一段,问能组成多少种合法的排列。

这道题和鹏神研究卡特兰数的推导和在这题中的结论式的推导:

首先就是如何理解从题意演变到卡特兰数:

排列的总长度为 n ,左右括号各为 m = n / 2 个。当给定的排列方式完全合法的时候,剩下需要排列的左右括号的数量就已经确定了,而在排列的过程中,左括号要始终大于等于右括号的数量。设现在有 a 个左括号, b 个右括号,那么这个就可以当做从( a , b )点到 ( m , m )点且不越过直线 y = x 的种类数。将图像下移,则可认为是从( 0 , 0 )点到 ( p , q )点且不越过直线 y = x 的种类数。

求种类数则是用总的种类数减去非法种类数。总的种类数可用组合数学 C(p+q,p),而非法种类数则是通过图形移动,将图形向下移动一个单位,原本要求越过 y = x ,移动后只要从( 0 , - 1 )点到( p , q - 1 )点且经过 y = x 的路径都是非法的。而计算这个种类数则可以用( 0 , - 1 )与( - 1 , 0 )关于 y = x 对称得,只要从计算从( - 1 , 0 )点到( p , q - 1 )的种类数即可,因为这两点分别在 y = x 的上下,所以路径一定经过 y = x ,种类数为 C ( p + q ,p - 1 );

相减得到 (( q - p + 1 ) / ( q + 1 )) * C(p+q,p);

但事实上,直接这样计算是会超时的,因此可以将这个式子继续化成:

(( p + q )!*( q - p + 1 ))/((q + 1)!* p!)

在这个式子中大量用到阶乘就是为了可以直接在开始时预处理出阶乘来缩短时间。

而除法则用到了求逆元。

 #include<stdio.h>
#include<string.h>
#define ll long long
const ll mod=;
char s[];
ll A[]; void fun(){
A[]=A[]=;
for(int i=;i<=;i++){
A[i]=(A[i-]*i)%mod;
}
}
/*
ll C(ll a,ll b){
ll i,ans=1;
for(i=1;i<=b;i++){
ans*=a-i+1;
ans/=i;
}
return ans;
}
*/
ll QuickPow(ll a,ll n){
ll tmp=a,ans=;
tmp %= mod;
while(n){
if(n&) ans=ans*tmp%mod;
tmp=tmp*tmp%mod;
n>>=;
}
return ans;
} int main(){
int n;
fun();
while(scanf("%d%s",&n,s)!=EOF){
if(n%)printf("0\n");
else{
int p=,q=,i,l=strlen(s);
for(i=;i<l;i++){
if(s[i]=='(')p++;
else q++;
if(p<q){
printf("0\n");
break;
}
}
if(p<q) continue;
{
p=n/-p;
q=n/-q;
if(p<||q<){
printf("0\n");
continue;
}
ll r1=QuickPow(A[p],mod-),r2=QuickPow(A[q+],mod-);
ll ans=A[p+q];
// printf("%lld %lld %lld\n",ans,r1,r2);
ans=(ans*((q-p+)%mod))%mod;
ans=(ans*r1)%mod;
ans=(ans*r2)%mod;
printf("%I64d\n",ans); }
}
}
return ;
}

hdu 5184 类卡特兰数+逆元的更多相关文章

  1. hdu 5673 Robot 卡特兰数+逆元

    Robot Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem D ...

  2. hdu 4828 Grids 卡特兰数+逆元

    Grids Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Problem D ...

  3. hdu 5184(数学-卡特兰数)

    Brackets Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Su ...

  4. HDU 4828 (卡特兰数+逆元)

    HDU 4828 Grids 思路:能够转化为卡特兰数,先把前n个人标为0,后n个人标为1.然后去全排列,全排列的数列,假设每一个1的前面相应的0大于等于1,那么就是满足的序列.假设把0看成入栈,1看 ...

  5. HDOJ 5184 Brackets 卡特兰数扩展

    既求从点(0,0)仅仅能向上或者向右而且不穿越y=x到达点(a,b)有多少总走法... 有公式: C(a+b,min(a,b))-C(a+b,min(a,b)-1)  /// 折纸法证明卡特兰数: h ...

  6. hdu_4828_Grids(卡特兰数+逆元)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4828 题意:中文,不解释 题解:实际就是一个卡特兰递推: Catalan(n+1)= Catalan( ...

  7. 【HDU 5184】 Brackets (卡特兰数)

    Brackets Problem Description We give the following inductive definition of a “regular brackets” sequ ...

  8. HDU 4828 Grids(卡特兰数+乘法逆元)

    首先我按着我的理解说一下它为什么是卡特兰数,首先卡特兰数有一个很典型的应用就是求1~N个自然数出栈情况的种类数.而这里正好就对应了这种情况.我们要满足题目中给的条件,数字应该是从小到大放置的,1肯定在 ...

  9. HDU 4828 (卡特兰数+逆)

    HDU 4828 Grids 思路:能够转化为卡特兰数,先把前n个人标为0.后n个人标为1.然后去全排列,全排列的数列.假设每一个1的前面相应的0大于等于1,那么就是满足的序列,假设把0看成入栈,1看 ...

随机推荐

  1. php 8小时时间差的解决方法小结

    原来从php5.1.0开始,php.ini里加入了date.timezone这个选项,默认情况下是关闭的 也就是显示的时间(无论用什么php命令)都是格林威治标准时间 和我们的时间(北京时间)差了正好 ...

  2. python3 操作windows的粘贴板(读取和传值)

    #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = "loki" import win32con import wi ...

  3. inputsimulator - Windows Input Simulator

    窗体输入模拟器提供一个基于 win32 SendInput  方法的 模拟键盘鼠标输入的.net 接口.windows 输入模拟器可用于 WPF.windows 窗体和控制台应用程序, 实现模拟任意按 ...

  4. Jzzhu and Numbers CodeForces - 449D (高维前缀和,容斥)

    大意: 给定集合a, 求a的按位与和等于0的非空子集数. 首先由容斥可以得到 $ans = \sum \limits_{0\le x <2^{20}} (-1)^{\alpha} f_x$, 其 ...

  5. Liebig's Barrels CodeForces - 985C (贪心)

    链接 大意:给定$nk$块木板, 要制作$n$个$k$块板的桶, 要求任意两桶容积差不超过$l$, 每个桶的容积为最短木板长, 输出$n$个桶的最大容积和 假设最短板长$m$, 显然最后桶的体积都在$ ...

  6. [Spring Boot] 使用多个Servlet

    当使用Spring boot的嵌入式servlet容器时,可以通过Spring bean或扫描Servlet组件的方式注册Servlet.Filter和Servlet规范的所有监听器(例如HttpSe ...

  7. POJ 3481 splay模板

    最后撸一发splay. 之前用treap撸的,现在splay也找到感觉了,果然不同凡响,两者之间差别与精妙之处各有其精髓! 真心赞一个! POJ平衡树的题目还是比较少,只能挑之前做过的捏一捏.但是收获 ...

  8. sublime 个人心得

    sublime 3快捷键: (1) Ctrl+O(Command+O)可以实现头文件和源文件之间的快速切换 (2) 双击可选中光标所在单词,三击可选中光标所在行(等同于Ctrl+L(Command+L ...

  9. Qt经典—线程、事件与Qobject

    介绍 You’re doing it wrong. — Bradley T. Hughes 线程是qt channel里最流行的讨论话题之一.许多人加入了讨论并询问如何解决他们在运行跨线程编程时所遇到 ...

  10. js获取当前点击元素的索引

    以ul下的li元素为例:获取li的索引,代码如下: <ul id="list"> <li></li> <li></li> ...