hdu 5184 类卡特兰数+逆元
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 类卡特兰数+逆元的更多相关文章
- hdu 5673 Robot 卡特兰数+逆元
Robot Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem D ...
- hdu 4828 Grids 卡特兰数+逆元
Grids Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Problem D ...
- hdu 5184(数学-卡特兰数)
Brackets Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Su ...
- HDU 4828 (卡特兰数+逆元)
HDU 4828 Grids 思路:能够转化为卡特兰数,先把前n个人标为0,后n个人标为1.然后去全排列,全排列的数列,假设每一个1的前面相应的0大于等于1,那么就是满足的序列.假设把0看成入栈,1看 ...
- HDOJ 5184 Brackets 卡特兰数扩展
既求从点(0,0)仅仅能向上或者向右而且不穿越y=x到达点(a,b)有多少总走法... 有公式: C(a+b,min(a,b))-C(a+b,min(a,b)-1) /// 折纸法证明卡特兰数: h ...
- hdu_4828_Grids(卡特兰数+逆元)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4828 题意:中文,不解释 题解:实际就是一个卡特兰递推: Catalan(n+1)= Catalan( ...
- 【HDU 5184】 Brackets (卡特兰数)
Brackets Problem Description We give the following inductive definition of a “regular brackets” sequ ...
- HDU 4828 Grids(卡特兰数+乘法逆元)
首先我按着我的理解说一下它为什么是卡特兰数,首先卡特兰数有一个很典型的应用就是求1~N个自然数出栈情况的种类数.而这里正好就对应了这种情况.我们要满足题目中给的条件,数字应该是从小到大放置的,1肯定在 ...
- HDU 4828 (卡特兰数+逆)
HDU 4828 Grids 思路:能够转化为卡特兰数,先把前n个人标为0.后n个人标为1.然后去全排列,全排列的数列.假设每一个1的前面相应的0大于等于1,那么就是满足的序列,假设把0看成入栈,1看 ...
随机推荐
- angular5 路由传参的几种方式
此处介绍三种方式 方式一: 问号后面带的参数, 例如:/product?id=1&name=iphone还可以是: [routerLink]="['/books']" [q ...
- English trip -- VC(情景课)2 D Reading
Xu言: 业精于勤,荒于嬉:行成于思,毁于随 Before you read 阅读准备 Talk about the picture, what do you see?看图说话,你看到了什么? Lis ...
- codeforces 853b//Jury Meeting// Codeforces Round #433 (Div. 1)
题意:几个人要去一个城市k天,现给出各航班的日期和花费,让这n个人能相会k天的最小花费? 用数组arr1[i]记录在第i天人到齐的最小花费.arr2[i]记录第i天之后才有人开始走的最小花费.然后取a ...
- Serega and Fun CodeForces - 455D (分块 或 splay)
大意:给定n元素序列, 2种操作 将区间$[l,r]$循环右移1位 询问$[l,r]$中有多少个等于k的元素 现在给定q个操作, 输出操作2的询问结果, 强制在线 思路1: 分块 每个块内维护一个链表 ...
- Almost Acyclic Graph CodeForces - 915D (思维,图论)
大意: 给定无向图, 求是否能删除一条边后使图无环 直接枚举边判环复杂度过大, 实际上删除一条边可以看做将该边从一个顶点上拿开, 直接枚举顶点即可 复杂度$O(n(n+m))$ #include &l ...
- Oracle11g温习-第八章:归档日志
2013年4月27日 星期六 10:36 1.归档和非归档的区别 1) 归档会在日志切换时,备份历史日志,用于OLTP(在线事务处理系统),可以进行冷备份和热备份,可以实现数据库完全恢复.不完全恢复 ...
- 贪心(二)NYOJ14题
#include <iostream> #include<cmath> #include "algorithm" using namespace std; ...
- WebForm页面数据绑定总结
总述 绑定语法 第一种: <%= str%> 例子:'<%= DateTime.Now %>'适用条件:用于非服务器端控件的属性第二种: <%= str%> 从出现 ...
- svn更新产生的异常
同步svn时差生的错误如下: 同步 SVNStatusSubscriber 时报告了错误.1 中的 0 个资源已经同步. 同步 /tunnel14 时发生错误:Error getting stat ...
- Edraw安装图解
Edraw安装图解 Success