【题目链接】 http://codeforces.com/problemset/problem/785/D

【题目大意】

  给出一个只包含左右括号的串,请你找出这个串中的一些子序列,
  要求满足"(((())))",即左边全是左括号右边全是右括号且数量相等的形式。
  求这样的子序列的数量。

【题解】

  我们枚举每个断点(,计算当这个位置作为最后一个左括号时候的方案数
  设左边有x个左括号,右边有y个右括号,那么统计答案为ΣC(x,i)*C(y,i+1)
  又有C(y,i+1)=C(y,y-1-i),所以答案为ΣC(x,i)*C(y,y-1-i)=C(x+y,y-1)

【代码】

#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long LL;
const int N=400010;
const LL mod=1000000007;
LL f[N],rf[N];
int l[N],r[N],m,n,k;
LL inv(int a,int m){return(a==1?1:inv(m%a,m)*(m-m/a)%m);}
LL C(int n,int m){if(n<m||m<0)return 0;return f[n]*rf[m]%mod*rf[n-m]%mod;}
void init(n){
f[0]=1LL;for(int i=1;i<=n;i++)f[i]=(LL)f[i-1]*i%mod;
rf[n]=inv(f[n],mod);
for(int i=n;i;i--)rf[i-1]=(LL)rf[i]*i%mod;
}
char s[N];
int sl[N],sr[N];
int main(){
init(400000);
scanf("%s",s+1);
int n=strlen(s+1);
for(int i=1;i<=n;i++)sl[i]=sl[i-1]+(s[i]=='(');
for(int i=n;i;i--)sr[i]=sr[i+1]+(s[i]==')');
LL ans=0;
for(int i=1;i<=n;i++)if(s[i]=='('){
int x=sl[i-1],y=sr[i+1];
ans=(ans+C(x+y,y-1))%mod;
}printf("%lld\n",ans);
return 0;
}

最新文章

  1. C和指针 第三章 变量的储存类型 auto、static、register以及static关键词
  2. Jquery基础之DOM操作
  3. weblogic 的安装和配置
  4. testng之listener
  5. 表单校验之datatype
  6. IntelliJ IDEA 13.x 下使用Hibernate + Spring MVC + JBoss 7.1.1
  7. 小议window.event || ev
  8. 【LeetCode题意分析&amp;解答】37. Sudoku Solver
  9. Spark结构式流编程指南
  10. Less的!important关键字
  11. nginx 配置访问 静态文件
  12. windows下使用electron+sqlite3
  13. vue计算属性和侦听器
  14. quartz开源插件(定时心跳后台执行)
  15. 铁通网络没有一个真实的公网IP,NAT转换能不能解决?
  16. 【跟着stackoverflow学Pandas】How to iterate over rows in a DataFrame in Pandas-DataFrame按行迭代
  17. Android 单元测试Junit
  18. ActiveMQ+SpringMVC+Maven应用示例
  19. HBase 协处理器编程详解,第二部分:客户端代码编写
  20. 参数化防SQL注入

热门文章

  1. git使用笔记(五)打标签
  2. POJ1182:食物链(并查集)
  3. vue文件使用stylus报错问题
  4. JS中二维数组的声明
  5. npm获取配置值的两种方式
  6. 归档普通对象Demo示例程序源代码
  7. zhudongfangyu.exe进程是360主动防御进程,用来监控电脑系统,防止电脑病毒出现并阻止病毒或木马的安全进程
  8. linux驱动学习(八) i2c驱动架构(史上最全) davinc dm368 i2c驱动分析【转】
  9. python--selectors
  10. Java常见知识点(一)