2019牛客暑期多校训练营(第一场)E ABBA (DP/卡特兰数)
知识点:卡特兰数/动态规划
法一:动态规划
由题意易知字符串的任何一个前缀都满足\(cnt(A) - cnt(B) \le n , cnt(B)-cnt(A)\le m\)
\(d[i][j]\) 表示前\(i\) 个字符,有 \(j\) 个\(A\) ,有\(i-j\) 个\(B\) 的方案数
- \(d[0][0] = 1,d[2*n+2*m][n+m] 为答案\)
- 当\(j-(i-j)\le n,(i-j)-j\le m\) 时,\(d[i][j] = d[i-1][j] + d[i-1][j-1]\)
#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9+7;
typedef long long ll;
int n,m;
ll d[4010][2010];
int main(){
while(~scanf("%d%d",&n,&m)){
d[0][0] = 1;
for(int i=1;i<=2*(n+m);i++){
for(int j=0;j<=i && j <= (n+m);j++){
int a = j;
int b = i - j;
if(a - b > n || b - a > m)continue;
d[i][j] = (d[i-1][j] + d[i-1][j-1])%mod;
}
}
printf("%lld\n",d[2*(n+m)][(n+m)]);
for(int i=1;i<=2*(n+m);i++){
for(int j=0;j<=i && j <=(n+m);j++)
d[i][j] = 0;
}
}
return 0;
}
法二:组合数学

设\(x\) 为A的个数,\(y\)为B的个数,那么由\((0,0)\rightarrow (n+m,n+m)\)的路径上面必须满足\(x-y\le n,y-x\le m\) 两个条件。
在经典的卡特兰数路径计数问题中就有提到,详情请参考:https://oi-wiki.org/math/catalan/
将上面两个限制放在图中就是两个直线,然后求起点到终点的非降路径方案数(非降的意思是x和y不能变小),先考虑偏上的那条线(下面同理可得),如果我们有一条路径越过了\(y=x+m\) 这条线,那么该路径上面一定会有一个点在\(y=x+m+1\)这条线上。
从上图中不难看出来,这样的路径等效于从\((-m-1,m+1)\)到\((n+m,n+m)\) 的路径,因为\((0,0)与(-m-1,m+1)关于y=x+m+1 对称\)。
又
- \((0,0)\rightarrow (n+m,n+m)\) 的所有非降路径数为\(C_{2n+2m}^{n+m}\)
- \((-m-1,m+1)\rightarrow (n+m,n+m) 的所有非降路径数为\)C_{2n+2m}^{n-1}$
- \((n+1,-n-1)\rightarrow (n+m,n+m)\) 的所有非降路径数位\(C_{2n+2m}^{m-1}\)
所以总答案为\(C_{2n+2m}^{n+m}-C_{2n+2m}^{n-1}-C_{2n+2m}^{m-1}\)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 10010;
const int p = 1e9+7;
ll jc[N],inv[N];
int n,m;
ll ksm(ll a,ll b){
ll res = 1;
for(;b;b >>= 1){
if(b & 1)res = res * a % p;
a = a * a % p;
}
return res;
}
ll C(int a,int b){
return jc[a] * inv[b] % p * inv[a-b] % p;
}
int main(){
jc[0] = inv[0] = 1;
for(int i=1;i<=4000;i++)jc[i] = jc[i-1] * i % p,inv[i] = ksm(jc[i],p-2);
while(~scanf("%d%d",&n,&m)){
int s = 2*(n+m);
printf("%lld\n",(C(s,s/2) - (C(s,n-1) + C(s,m-1))%p + p) % p);
}
return 0;
}
2019牛客暑期多校训练营(第一场)E ABBA (DP/卡特兰数)的更多相关文章
- 2019牛客暑期多校训练营(第二场) H-Second Large Rectangle(单调栈)
题意:给出由01组成的矩阵,求求全是1的次大子矩阵. 思路: 单调栈 全是1的最大子矩阵的变形,不能直接把所有的面积存起来然后排序取第二大的,因为次大子矩阵可能在最大子矩阵里面,比如: 1 0 0 1 ...
- 2019牛客暑期多校训练营(第九场) D Knapsack Cryptosystem
题目 题意: 给你n(最大36)个数,让你从这n个数里面找出来一些数,使这些数的和等于s(题目输入),用到的数输出1,没有用到的数输出0 例如:3 4 2 3 4 输出:0 0 1 题解: 认真想一 ...
- 2019牛客暑期多校训练营(第五场)G - subsequeue 1 (一题我真的不会的题)
layout: post title: 2019牛客暑期多校训练营(第五场)G - subsequeue 1 (一题我真的不会的题) author: "luowentaoaa" c ...
- 2019牛客暑期多校训练营(第一场)A Equivalent Prefixes(单调栈/二分+分治)
链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 Two arrays u and v each with m distinct elements ...
- 2019牛客暑期多校训练营(第一场)A题【单调栈】(补题)
链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 题目描述 Two arrays u and v each with m distinct elem ...
- 2019牛客暑期多校训练营(第一场) B Integration (数学)
链接:https://ac.nowcoder.com/acm/contest/881/B 来源:牛客网 Integration 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 5242 ...
- 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)
链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...
- 2019牛客暑期多校训练营(第二场)F.Partition problem
链接:https://ac.nowcoder.com/acm/contest/882/F来源:牛客网 Given 2N people, you need to assign each of them ...
- 2019牛客暑期多校训练营(第九场)A:Power of Fibonacci(斐波拉契幂次和)
题意:求Σfi^m%p. zoj上p是1e9+7,牛客是1e9: 对于这两个,分别有不同的做法. 前者利用公式,公式里面有sqrt(5),我们只需要二次剩余求即可. 后者mod=1e9,5才 ...
- 2019牛客暑期多校训练营(第八场)E.Explorer
链接:https://ac.nowcoder.com/acm/contest/888/E来源:牛客网 Gromah and LZR have entered the fifth level. Unli ...
随机推荐
- Netty与NIO
初识Netty Netty是由JBoss提供的一个Java的开源框架,是GitHub上的独立项目. Netty是一个异步的,基于事件驱动的网络应用框架,用于快速开发高性能.高可靠的网络IO程序. Ne ...
- 为啥使用innodb_flush_method=o_direct 就能减轻io压力呢
为啥使用innodb_flush_method=o_direct 就能减轻io压力呢
- 误删除SAP ECC中的profile文件
环境:ECC6.0 EHP4 FOR ORACLE ON WINDWS X64下 今天在RZ10配置系统参数文件的时候,不小心错删除了instance profile文件,这下惨了,这是操作系统层级 ...
- SAP中使用FTP服务
SAP中简单的FTP技术实现基本上如下几个步骤: 1.SM59建立FTP的RFC destination. 可以通过执行SAP的标准程序RSFTP005,自动创建两个名为SAPFTP何SAPFTPA的 ...
- Ribbon负载均衡服务调用
1.在听周阳老师讲解时,使用Ribbon核心组件IRule时是这样用的: ribbon版本 : 自定义配置类不能放在@ComponentScan所扫描的当前包下以及子包下,项目结构如下 MySelfR ...
- [Usaco2007 Jan]Telephone Lines架设电话线
题目描述 FarmerJohn打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用.FJ的农场周围分布着N(1<=N<=1,000)根 ...
- C++导言与入门
写在开始 计算机编程语言: Remember that a program is just a sequence of instructions telling a computer what to ...
- 干电池升压3.3V的电源芯片
PW5100适用于一节干电池升压到3.3V,两节干电池升压3.3V的升压电路,PW5100干电池升压IC. 干电池1.5V和两节干电池3V升压到3.3V的测试数据 两节干电池输出500MA测试: PW ...
- HTTPS请求HTTP接口被浏览器阻塞,python实现websocket客户端,websocket服务器,跨域问题,dwebsocket,https,拦截,服务端
HTTPS请求HTTP接口被浏览器阻塞,python实现websocket客户端,websocket服务器,跨域问题,dwebsocket,https,拦截,服务端 发表时间:2020-03-05 1 ...
- JavaScript中创建对象的三种方式!
JavaScript中创建对象的三种方式! 第一种 利用对象字面量! // 创建对象的三种方式! // 1 对象字面量. var obj = { // 对象的属性和方法! name: 'lvhang' ...