卡特兰数 相关问题 hdu 5184 Brackets
题解:
当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的方法数是
证明如下: 我们可以通过总的数目来减掉非法的数目即可。 把(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)的方法数是相同的。 所以答案是
然后对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相关推荐
- 卡特兰数相关及通项公式简单证明
卡特兰数有两个递推公式,两个通项公式(或者说是一个): 规定h(0)=1h(0)=1h(0)=1, h(1)=1h(1)=1h(1)=1 hn=∑i=0n−1hihn−ih_n=\displaysty ...
- Catalan (卡特兰数)
Catalan (卡特兰数) 前置知识: 1.排列数公式: A n m = n ( n − 1 ) ( n − 2 ) . . . ( n − m + 1 ) A^m_n=n(n-1)(n-2)... ...
- 从《编程之美》买票找零问题说起,娓娓道来卡特兰数——兼爬坑指南
转自:从<编程之美>买票找零问题说起,娓娓道来卡特兰数--兼爬坑指南 引子: 大约两个月前,我在练习一些招聘的笔试题中,有一道和卡特兰数相关.那时还没来得及开始仔细看<编程之美> ...
- 【HDU 5184】 Brackets (卡特兰数)
Brackets Problem Description We give the following inductive definition of a "regular brackets& ...
- HDOJ 5184 Brackets 卡特兰数扩展
既求从点(0,0)仅仅能向上或者向右而且不穿越y=x到达点(a,b)有多少总走法... 有公式: C(a+b,min(a,b))-C(a+b,min(a,b)-1) /// 折纸法证明卡特兰数: h ...
- HDU 5673 Robot 卡特兰数
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5673 题目描述: 一个人从原点开始向右走, 要求N秒后回到原点, 且过程中不能到负半轴, 人有两种操 ...
- 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 ...
- 卡特兰数 二叉树相关公式 二叉树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) ...
- hdu 1023 大数 卡特兰数
卡特兰数 JAVA大数 import java.util.*; import java.math.*; public class Main {public static void main(Strin ...
最新文章
- python获取图片像素矩阵_用python处理图片实现图像中的像素访问
- windows 2003 禁止UDP的bat
- python一些小操作
- jtable mysql数据库_使用MySQL数据库语法错误填充jTable
- 现在就是.Net最好的时代!我赞成,谁反对?
- python根据地址查看变量名_tensorflow创建变量以及根据名称查找变量
- eclipse下载与安装步骤详解,包含解决错误(最全最详细,多图)
- jsmin php,使用JSMin.php缩小Javascript
- Windows 实用小工具
- pdf如何去除保护限制,pdf复制打印限制怎么解除?
- 中国被动元件市场规模调研与发展趋势预测报告2022版
- 实时调试WebDriver代码
- 产品冷思考:大而全or小而美如何选择?
- Alpha、伪Beta 发布后,夏一鸣的个人感想与体会
- 概率论得学习和整理6:概率的分布
- 苹果手机短信如何转入Android手机,苹果手机怎么将短信备份导入到安卓手机?...
- 2022年全球与中国条码标签打印机市场现状及未来发展趋势
- 好看的网站跳转页面网站源码
- C++调用python,并抓取每日一句名言
- Linux转发性能评估与优化之——转发瓶颈分析与解决方案