题意:求n个1,m个-1组成的所有序列中,最大前缀之和。

首先引出这样一个问题:使用n个左括号和m个右括号,组成的合法的括号匹配(每个右括号都有对应的左括号和它匹配)的数目是多少?

1.当n=m时,显然答案为卡特兰数$C_{2n}^{n}-C_{2n}^{n+1}$

2.当n<m时,无论如何都不合法,答案为0

3.当n>m时,答案为$C_{n+m}^{n}-C_{n+m}^{n+1}$,这是一个推论,证明过程有点抽象,方法是把不合法的方案数等价于从(0,-2)移动到(n+m,n-m)的方案数,详见https://blog.csdn.net/x_1023/article/details/78290683

回到题目,如果把1看成右括号,把-1看成左括号,那么最大前缀和为0相当于匹配合法,就是上面讨论的第三种情况。

如果进一步扩展,最大前缀和为1,2,3,...,k的情况该如何处理呢?

考虑最大前缀和大于等于k的情况,其实根据上面的方法,可以等价于从点(0,-2k)走到点(n+m,n-m)的方案数,即$C_{n+m}^{n+k}$,前提是$max(m-n,0)\leqslant k\leqslant m$,然后差分一下就能得到最大前缀和等于k时的方案数了。复杂度$O(n+m)$。由于题目中的n和m分别代表右括号和左括号,所以n和m要反过来。

自己的组合数学真是太辣鸡了,还是要提高一下姿势水平~

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=+,mod=;
int n,m,inv[N],f[N],invf[N],ans[N];
int C(int n,int m) {return n<m?:(ll)f[n]*invf[m]%mod*invf[n-m]%mod;}
int main() {
inv[]=f[]=invf[]=;
for(int i=; i<N; ++i)inv[i]=(ll)(mod-mod/i)*inv[mod%i]%mod;
for(int i=; i<N; ++i)f[i]=(ll)f[i-]*i%mod,invf[i]=(ll)invf[i-]*inv[i]%mod;
scanf("%d%d",&n,&m);
for(int i=max(n-m,); i<=n; ++i)ans[i]=C(n+m,m+i);
for(int i=max(n-m,); i<n; ++i)ans[i]=(ans[i]-ans[i+]+mod)%mod;
int sum=;
for(int i=max(n-m,); i<=n; ++i)sum=(sum+(ll)i*ans[i]%mod)%mod;
printf("%d\n",sum);
return ;
}

CodeForces - 1204E Natasha, Sasha and the Prefix Sums (组合数学,卡特兰数扩展)的更多相关文章

  1. CodeForces 1204E"Natasha, Sasha and the Prefix Sums"(动态规划 or 组合数学--卡特兰数的应用)

    传送门 •参考资料 [1]:CF1204E Natasha, Sasha and the Prefix Sums(动态规划+组合数) •题意 由 n 个 1 和 m 个 -1 组成的 $C_{n+m} ...

  2. CF1204E Natasha, Sasha and the Prefix Sums(组合数学)

    做法一 \(O(nm)\) 考虑\(f(i,j)\)为i个+1,j个-1的贡献 \(f(i-1,j)\)考虑往序列首添加一个\(1\),则贡献\(1\times\)为序列的个数:\(C(j+i-1,i ...

  3. [CF1204E]Natasha,Sasha and the Prefix Sums 题解

    前言 本文中的排列指由n个1, m个-1构成的序列中的一种. 题目这么长不吐槽了,但是这确实是一道好题. 题解 DP题话不多说,直接状态/变量/转移. 状态 我们定义f表示"最大prefix ...

  4. E. Natasha, Sasha and the Prefix Sums

    http://codeforces.com/contest/1204/problem/E 给定n个 1 m个 -1的全排 求所有排列的$f(a) = max(0,max_{1≤i≤l} \sum_{j ...

  5. CF1204E Natasha, Sasha and the Prefix Sums (卡塔兰数推理)

    题面 题解 把题意变换一下,从(0,0)走到(n,m),每次只能网右或往上走,所以假设最大前缀和为f(n),那么走的时候就要到达但不超过 y = x-f(n) 这条线, 我们可以枚举答案,然后乘上方案 ...

  6. Codeforces Round #581 (Div. 2)-E. Natasha, Sasha and the Prefix Sums-动态规划+组合数学

    Codeforces Round #581 (Div. 2)-E. Natasha, Sasha and the Prefix Sums-动态规划+组合数学 [Problem Description] ...

  7. CodeForces 837F - Prefix Sums | Educational Codeforces Round 26

    按tutorial打的我血崩,死活挂第四组- - 思路来自FXXL /* CodeForces 837F - Prefix Sums [ 二分,组合数 ] | Educational Codeforc ...

  8. Educational Codeforces Round 26 [ D. Round Subset ] [ E. Vasya's Function ] [ F. Prefix Sums ]

    PROBLEM D - Round Subset 题 OvO http://codeforces.com/contest/837/problem/D 837D 解 DP, dp[i][j]代表已经选择 ...

  9. Codeforces 837F Prefix Sums

    Prefix Sums 在 n >= 4时候直接暴力. n <= 4的时候二分加矩阵快速幂去check #include<bits/stdc++.h> #define LL l ...

随机推荐

  1. springboot整合es客户端操作elasticsearch(五)

    springboot整合es客户端操作elasticsearch的总结: 客户端可以进行可以对所有文档进行查询,就是不加任何条件: SearchRequest searchRequest = new ...

  2. Job的运行过程

    Job的运行过程 Job的具体运行过程 a) 运行mapred程序 b) 本次运行将生成一个Job,于是JobClient向JobTracker(ResourceManager)申请一个JobId以标 ...

  3. Elasticsearch基础入门,详情可见官方文档

    索引文档: 对于员工目录,我们将做如下操作: 每个员工索引一个文档,文档包含该员工的所有信息. 每个文档都将是 employee 类型 . 该类型位于 索引 megacorp 内. 该索引保存在我们的 ...

  4. day16 模块导入及环境变量

    """ 今日内容: 1.模块 2.模块的导入 3.环境变量sys.path 4.模块间的相互调用 """ """ ...

  5. iView中Tree组件children中动态checked选中后取消勾选再选中无效问题

    如题,我有一个Tree组件,动态更新check选中子级列表的时候,取消勾选了再点击选中时复选框样式不是勾选状态,但是数据已经有了. 对此解决方案是:将初始化时Tree组件data数据深拷贝一遍再去判断 ...

  6. zping ping包工具20180605.exe测试版

    链接: https://pan.baidu.com/s/1WB3BZn0r9n4DRU_8bNC65g 提取码: mybi zping的第一个exe版本由于未对兼容性进行测试,使用python3.6编 ...

  7. 【深入浅出-JVM】(2):原码、反码、补码

    计算机中有补码表示 0 0 为正数 原码 00000000 00000000 00000000 00000000 反码 00000000 00000000 00000000 00000000 正数反码 ...

  8. PAT A1058 A+B in Hogwarts (20)

    AC代码 #include <cstdio> struct Money { long long Galleon, Sicklke, Knut; }A, B, Sum; void init( ...

  9. h5中的分组元素figure、figcaption、hgroup元素介绍

    分组元素用于对页面中的内容进行分组. figure元素和figcaption元素 figure元素用于定义独立的流内容(图像.图表.照片.代码等),一般指一个独立的单元.figure元素的内容应该与主 ...

  10. 网易Java程序员两轮面试,这些问题你能答对几个?

    一转眼,2018 年已经过去了,你是否在满意的公司?拿着理想的薪水? 虽然"钱多.事少.离家近"的工作可能离技术人比较远,但是找到一份合适的工作,其实并不像想象中那么难.但是,有些 ...