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