题解:

当n为奇数的时候答案是0。
先判断字符串的前面是否符合括号匹配,即对于任何前缀左括号个数>=右括号个数。
设左括号个数为a右括号个数为b, m=n/2,问题可以转化为在平面中从座标(a,b)沿网格走到(m,m) 且不跨过x=y这一条直线的方法数。数据太大,普通DP和搜索都不行的。
问题可以进一步转化为从(a-n,b-n)到(0,0)且不跨过x=y的方法数。再对称一下,转化到(0,0)到(n-b,n-a)不跨过x=y的方法数。对于从(0,0)点走到(p,q)点不跨过x=y的方法数是
p−q+1p+1Cqp+q
证明如下:
我们可以通过总的数目来减掉非法的数目即可。
把(0,0)和(p,q)都往下移一格,非法数目即为(0,-1)到(p,q-1)且路径中至少有一点和x=y相交的方法数。记(d,d)为从(0,-1)到(p,q-1)路径中最先和x=y相交的点。则由于对称性(-1,0)到(d,d)的方法数和(0,-1)到(d,d)的方法数是相同的。所以(0,-1)到(p,q-1)且与x=y相交的方法数和(-1,0)到(p,q-1)的方法数是相同的。
所以答案是
Cqp+q−Cq−1p+q=p−q+1p+1Cqp+q
然后对100W以内的数字进行一个阶乘处理,就可以O(1)得出答案了。

相关问题:

经典的买票问题,:本次足球比赛的门票为50元,而站排买票的球迷有m个人手里拿着一张面值50元的钞票,有n个人手里拿着一张面值100元的钞票。工作人员事先忘了为售票处准备任何零钱,请问您是否能算出这(m+n)个人共有多少种排队方式买票,使售票处不至于出现找不开钱的尴尬局面?

问题即p个‘(’,q个‘)’,p>=q,满足条件的排列数,答案即为Cqp+q−Cq−1p+q=p−q+1p+1Cqp+q

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
#include<vector>
#include<utility>
#include<queue>
#include<set>
#include<map>
#include<math.h>
#include<string>
using namespace std;
#define inf 0x3f3f3f3f
#pragma warning(disable:4996)
#pragma comment(linker, "/STACK:102400000,102400000")
#define ll long long
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define mem(a,b) memset(a,b,sizeof(a))
const double eps = 1e-9;
const ll mod = 1e9 + 7;
#define N 1000000char p[1000010];
ll h[N+10]; //阶乘表
ll g[N+10]; //阶乘逆元表
ll inv(ll a, ll mod)
{return a == 1 ? 1 : (mod - mod / a) * inv(mod % a, mod) % mod;
}
ll C(int a, int b)
{if (a < b) return 0;return h[a] * g[b] % mod*g[a - b] % mod;
}
void init()
{int i;h[0] = 1;for (i = 1; i <= N; i++)h[i] = h[i - 1] * i%mod;g[N] = inv(h[N], mod);for (i = N; i >= 1; i--)g[i - 1] = g[i] * i%mod;
}
int main()
{int i, j, k;int n;init();while (scanf("%d", &n) != EOF){scanf("%s", p);if (n & 1){printf("0\n");continue;}int sum = 0;int len = strlen(p);int flag = 0;for (i = 0; i < len; i++){if (p[i] == '(')sum++;else sum--;if (sum < 0){flag = 1;break;}}if (flag == 1){printf("0\n");continue;}n -= len;if (n == 0){if (sum == 0)printf("1\n");elseprintf("0\n");continue;}if (n < sum){printf("0\n");continue;}if (n == sum){printf("1\n");continue;}if ((n - sum) % 2 == 1){printf("0\n");continue;}int th = (n - sum) / 2;int q = th, p = th + sum;ll ans = C(p + q, q)*(p - q + 1) % mod*inv(p + 1, mod) % mod;printf("%I64d\n", ans);}
}

卡特兰数 相关问题 hdu 5184 Brackets相关推荐

  1. 卡特兰数相关及通项公式简单证明

    卡特兰数有两个递推公式,两个通项公式(或者说是一个): 规定h(0)=1h(0)=1h(0)=1, h(1)=1h(1)=1h(1)=1 hn=∑i=0n−1hihn−ih_n=\displaysty ...

  2. Catalan (卡特兰数)

    Catalan (卡特兰数) 前置知识: 1.排列数公式: A n m = n ( n − 1 ) ( n − 2 ) . . . ( n − m + 1 ) A^m_n=n(n-1)(n-2)... ...

  3. 从《编程之美》买票找零问题说起,娓娓道来卡特兰数——兼爬坑指南

    转自:从<编程之美>买票找零问题说起,娓娓道来卡特兰数--兼爬坑指南 引子: 大约两个月前,我在练习一些招聘的笔试题中,有一道和卡特兰数相关.那时还没来得及开始仔细看<编程之美> ...

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

    Brackets Problem Description We give the following inductive definition of a "regular brackets& ...

  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 5673 Robot 卡特兰数

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5673 题目描述: 一个人从原点开始向右走, 要求N秒后回到原点, 且过程中不能到负半轴, 人有两种操 ...

  7. HDU 3240 Counting Binary Trees 数论-卡特兰数

    题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=3240 卡特兰数递推公式h(i)=h(i-1)*(4*i-2)/(i+1) 如果直接算每一步,然后mo ...

  8. 卡特兰数 二叉树相关公式 二叉树ADT操作

    目录 卡特兰数 二叉树相关公式 二叉树ADT操作 卡特兰数 )! A(2,2)=4!/2!=4*3=12 A(4,2)=4!/2!=4*3=12 C(4,2)=4!/(2!*2!)=4*3/(2*1) ...

  9. hdu 1023 大数 卡特兰数

    卡特兰数 JAVA大数 import java.util.*; import java.math.*; public class Main {public static void main(Strin ...

最新文章

  1. python获取图片像素矩阵_用python处理图片实现图像中的像素访问
  2. windows 2003 禁止UDP的bat
  3. python一些小操作
  4. jtable mysql数据库_使用MySQL数据库语法错误填充jTable
  5. 现在就是.Net最好的时代!我赞成,谁反对?
  6. python根据地址查看变量名_tensorflow创建变量以及根据名称查找变量
  7. eclipse下载与安装步骤详解,包含解决错误(最全最详细,多图)
  8. jsmin php,使用JSMin.php缩小Javascript
  9. Windows 实用小工具
  10. pdf如何去除保护限制,pdf复制打印限制怎么解除?
  11. 中国被动元件市场规模调研与发展趋势预测报告2022版
  12. 实时调试WebDriver代码
  13. 产品冷思考:大而全or小而美如何选择?
  14. Alpha、伪Beta 发布后,夏一鸣的个人感想与体会
  15. 概率论得学习和整理6:概率的分布
  16. 苹果手机短信如何转入Android手机,苹果手机怎么将短信备份导入到安卓手机?...
  17. 2022年全球与中国条码标签打印机市场现状及未来发展趋势
  18. 好看的网站跳转页面网站源码
  19. C++调用python,并抓取每日一句名言
  20. Linux转发性能评估与优化之——转发瓶颈分析与解决方案

热门文章

  1. 如何在不清空原有配置的情况下恢复路由器密码?巨强!
  2. python批量循环图片识别_python如何进行批量图片处理
  3. 手把手教你做项目MySQL篇——从下载到命令总结
  4. ARP工作原理以及ARP欺骗、中间人攻击
  5. Pygame | 7 - 键盘输入
  6. SystemUI 10.0设置SIM卡锁,重启手机,解SIM卡锁之后点击返回,锁屏界面显示空白
  7. 2020-7-28 ------2021-2-2 年度总结
  8. 计算机视觉三大顶级会议ICCV,CVPR,ECCV
  9. 使用宽带路由器方式共享上网频繁掉线
  10. CF 29A Spit Problem