传送门

知识点:卡特兰数/动态规划

法一:动态规划

由题意易知字符串的任何一个前缀都满足\(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 对称\)。

  1. \((0,0)\rightarrow (n+m,n+m)\) 的所有非降路径数为\(C_{2n+2m}^{n+m}\)
  2. \((-m-1,m+1)\rightarrow (n+m,n+m) 的所有非降路径数为\)C_{2n+2m}^{n-1}$
  3. \((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/卡特兰数)的更多相关文章

  1. 2019牛客暑期多校训练营(第二场) H-Second Large Rectangle(单调栈)

    题意:给出由01组成的矩阵,求求全是1的次大子矩阵. 思路: 单调栈 全是1的最大子矩阵的变形,不能直接把所有的面积存起来然后排序取第二大的,因为次大子矩阵可能在最大子矩阵里面,比如: 1 0 0 1 ...

  2. 2019牛客暑期多校训练营(第九场) D Knapsack Cryptosystem

    题目 题意: 给你n(最大36)个数,让你从这n个数里面找出来一些数,使这些数的和等于s(题目输入),用到的数输出1,没有用到的数输出0 例如:3  4 2 3 4 输出:0 0 1 题解: 认真想一 ...

  3. 2019牛客暑期多校训练营(第五场)G - subsequeue 1 (一题我真的不会的题)

    layout: post title: 2019牛客暑期多校训练营(第五场)G - subsequeue 1 (一题我真的不会的题) author: "luowentaoaa" c ...

  4. 2019牛客暑期多校训练营(第一场)A Equivalent Prefixes(单调栈/二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 Two arrays u and v each with m distinct elements ...

  5. 2019牛客暑期多校训练营(第一场)A题【单调栈】(补题)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 题目描述 Two arrays u and v each with m distinct elem ...

  6. 2019牛客暑期多校训练营(第一场) B Integration (数学)

    链接:https://ac.nowcoder.com/acm/contest/881/B 来源:牛客网 Integration 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 5242 ...

  7. 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...

  8. 2019牛客暑期多校训练营(第二场)F.Partition problem

    链接:https://ac.nowcoder.com/acm/contest/882/F来源:牛客网 Given 2N people, you need to assign each of them ...

  9. 2019牛客暑期多校训练营(第九场)A:Power of Fibonacci(斐波拉契幂次和)

    题意:求Σfi^m%p. zoj上p是1e9+7,牛客是1e9:  对于这两个,分别有不同的做法. 前者利用公式,公式里面有sqrt(5),我们只需要二次剩余求即可.     后者mod=1e9,5才 ...

  10. 2019牛客暑期多校训练营(第八场)E.Explorer

    链接:https://ac.nowcoder.com/acm/contest/888/E来源:牛客网 Gromah and LZR have entered the fifth level. Unli ...

随机推荐

  1. ssh升级以及ssh: symbol lookup error: ssh: undefined symbol: EVP_aes_128_ctr错误处理

    1.解压安装openssl包:(不能卸载openssl,否则会影响系统的ssl加密库文件,除非你可以做两个软连接libcryto和libssl) # tar -zxvf openssl-1.0.1.t ...

  2. Spring Boot Security 国际化 多语言 i18n 趟过巨坑

    网上很多的spring boot国际化的文章都是正常情况下的使用方法 如果你像我一样用了Spring Security 那么在多语言的时候可能就会遇到一个深渊 Spring Security里面的异常 ...

  3. 【渲染引擎】Blender的2021年最佳渲染引擎(上)

    Blender最终摆脱了"古怪的孩子"的装束,并穿上了更为严肃和受人尊敬的" 3D强者". 它已在业界获得广泛认可,许多工作室和艺术家正在将其纳入他们的产品线. ...

  4. MySQL常用字符串函数和日期函数

    数据函数 SELECT ABS(-8); /*绝对值*/ SELECT CEILING(9.4); /*向上取整*/ SELECT FLOOR(9.4); /*向下取整*/ SELECT RAND() ...

  5. 【Docker】Failed to get D-Bus connection: Operation not permitted解决

    ------------------------------------------------------------------------------------------------- | ...

  6. CS远控

    Cobaltstrike 一.基础使用 ./teamserver 192.168.43.224 123456 启动服务器端 在windows下的链接 双击bat文件即可 在linux下 ./start ...

  7. 针对Linux系统主机,进入修复模式,解决开机报错问题

    1.让主机重启,进入开机时的内核选择界面,按e进入编辑界面 2.找到linux16那一行,将光标移动到最前面,按下End键,到这一行的末尾,然后空格 rd.break console=tty0 3.第 ...

  8. Py第一次练习,第二次练习

    有两个列表      l1 = [11,22,33]        l2 = [22,33,44] 1.获取内容相同的元素列表2.获取l1中有l2中没有的元素列表3.获取l1和l2中不同的元素列表 l ...

  9. 简单的DbContext工厂类(EFCore)

    前言 根据appsettings.json的中配置的数据库类型,使用工厂模式创建DbContext 代码实现 appsettings.json中的配置项 //使用的数据库类型 "Server ...

  10. VGA调试心得

    以前自己调试过视频信号,无非就时钟加行场同步加数据线,如果视频信号出问题,第一看现象,第二测频率,反正出问题不是消隐信号出问题,就是时钟频率出问题.通过这种方式也调试成功过几个显示屏,然后就以为自己对 ...