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. LeetCode--058--最后一个单词的长度

    问题描述 给定一个仅包含大小写字母和空格 ' ' 的字符串,返回其最后一个单词的长度. 如果不存在最后一个单词,请返回 0 . 说明:一个单词是指由字母组成,但不包含任何空格的字符串. 示例: 输入: ...

  2. memcached哈希表操作主要逻辑笔记

    以下注释的源代码都在memcached项目的assoc.c文件中 /* how many powers of 2's worth of buckets we use */ unsigned int h ...

  3. Android 7.0真实上手体验

    Android 7.0真实上手体验 Android 7.0的首个开发者预览版发布了,支持的设备只有Nexus6.Nexus 5X.Nexus 6P.Nexus 9.Nexus Player.Pixel ...

  4. CentOS7 install apache

    1. yum install httpd 2. config /etc/httpd/conf/httpd.conf <VirtualHost *:80>  ServerName www.l ...

  5. spring cloud shutdown graceful 优雅停机

    spring cloud shutdown graceful 优雅停机 当一个服务启动后,会注册到eureka中,其他的服务也可以从eureka获取到新注册的服务.但当我们要停止一个服务的时候,如果直 ...

  6. Oracle12c中多宿主环境(CDB&amp;PDB)的数据库触发器(Database Trigger)

    Oracle12c中可插拔数据库(PDBs)上的多宿主数据库触发器 随着多宿主选项的引入,数据库事件触发器可以在CDB和PDB范围内创建. 1.   触发器范围 为了在CDB中创建数据库事件触发器,需 ...

  7. win32com问题

    py -3 -m pip install adodbapi win32com.__gen_path__, "dicts.dat" 问题解决       pip install xl ...

  8. linux processes identifiers

    Linux, like all Unix uses user and group identifiers to check for access rights to files and images ...

  9. jsonp 跨域1

    今天上课学到了jsonp,看了理解,还需要多敲,代码贴出来看看 <!doctype html> <html> <head> <meta charset=&qu ...

  10. 快速切题 sgu113 Nearly prime numbers 难度:0

    113. Nearly prime numbers time limit per test: 0.25 sec. memory limit per test: 4096 KB Nearly prime ...