题目传送门(内部题82)


输入格式

  一行一个字符串$ss$,保证$ss$中只包含$'('$和$')'$。


输出格式

  一行一个整数,表示满足要求的子序列数对$10^9+7$的结果。


样例

样例输入1:

)(()()

样例输出1:

6

样例输入2:

()()()

样例输出2:

7

样例输入3:

)))

样例输出3:

0


数据范围与提示

样例解释:

  第一组样例中,有以下几种子序列满足条件(字符串下标从$1$计数):
  删除$1,5$位置的字符,得到$(())$
  删除$1,2,3,4$位置的字符,得到$()$
  删除$1,2,4,5$位置的字符,得到$()$
  删除$1,2,5,6$位置的字符,得到$()$
  删除$1,3,4,5$位置的字符,得到$()$
  删除$1,3,5,6$位置的字符,得到$()$

数据范围:

  设$n$为$ss$长度
  对于$20\%$的数据,$n\leqslant 20$
  对于$50\%$的数据,$n\leqslant 2,000$
  对于$100\%$的数据,$n\leqslant 200,000$


题解

可以从左到右枚举左右括号的分界点,但是显然会算重,考虑容斥?

其实有更简单的做法,直接要求旁边的左(右)括号必须选就好了。

然后就有了$n^2$的做法。

但是如果你做过这道题:排列组合,那就简单多了。

时间复杂度:$\Theta(n)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
const int mod=1000000007;
int n;
char ch[200001];
int l[200001],r[200001];
long long fac[200001],inv[200001];
long long ans;
long long qpow(long long x,long long y)
{
long long res=1;
while(y)
{
if(y&1)res=res*x%mod;
x=x*x%mod;
y>>=1;
}
return res;
}
void pre_work()
{
fac[0]=1;
for(int i=1;i<=200000;i++)
fac[i]=fac[i-1]*i%mod;
inv[200000]=qpow(fac[200000],mod-2);
for(int i=200000;i;i--)
inv[i-1]=inv[i]*i%mod;
}
long long C(long long x,long long y)
{
if(x<y)return 0;
return fac[x]*inv[y]%mod*inv[x-y]%mod;
}
int main()
{
pre_work();
scanf("%s",ch+1);
n=strlen(ch+1);
for(int i=1;i<=n;i++)l[i]=l[i-1]+(ch[i]=='(');
for(int i=n;i;i--)r[i]=r[i+1]+(ch[i]==')');
for(int i=1;i<=n;i++)
if(ch[i]=='(')
ans=(ans+C(l[i-1]+r[i+1],r[i+1]-1))%mod;
printf("%lld",ans);
return 0;
}

rp++

[CSP-S模拟测试]:简单的括号序列(组合数)的更多相关文章

  1. csps模拟83最大异或和简单的括号序列旅行计划题解

    题面:https://www.cnblogs.com/Juve/articles/11733280.html 最大异或和: 简单博弈,小Q一定不会输,如果异或和为0,则平局,因为无论小Q如何拿,小T都 ...

  2. [CSP-S模拟测试]:简单的序列(DP)

    题目描述 从前有个括号序列$s$,满足$|s|=m$.你需要统计括号序列对$(p,q)$的数量. 其中$(p,q)$满足$|p|+|s|+|q|=n$,且$p+s+q$是一个合法的括号序列. 输入格式 ...

  3. [CSP-S模拟测试]:简单的填数(贪心+模拟)

    题目描述 对于一个长度为$n$,且下标从$1$开始编号的序列$a$,我们定义它是「合法的」,当且仅当它满足以下条件:·$a_1=1$·对于$i\in [1,n),a_i\leqslant a_{i+1 ...

  4. [CSP-S模拟测试]:简单的区间(分治)

    题目描述 给定一个长度为$n$的序列$a$以及常数$k$,序列从$1$开始编号.记$$f(l,t)=\sum \limits_{i=l}^ra_i-\max \limits_{i=l}^r\{a_i\ ...

  5. csp-s模拟测试52平均数,序列题解

    题面:https://www.cnblogs.com/Juve/articles/11602244.html 平均数: 第k个平均数不好求,我们考虑二分,转化成平均数小于x的有几个 虑把序列中的每个数 ...

  6. [CSP-S模拟测试]:简单计算(数学)

    题目传送门(内部题104) 输入格式 第一行一个正整数$T$,表示该测试点内的数据组数,你需要对该测试点内的$T$组数据都分别给出正确的答案才能获得该测试点的分数. 接下来$T$组数据,每组数据一行两 ...

  7. [CSP-S模拟测试]:简单的操作(二分图+图的直径)

    题目描述 从前有个包含$n$个点,$m$条边,无自环和重边的无向图. 对于两个没有直接连边的点$u,v$,你可以将它们合并.具体来说,你可以删除$u,v$及所有以它们作为端点的边,然后加入一个新点$x ...

  8. [CSP-S模拟测试]:简单的期望(DP)

    题目描述 从前有个变量$x$,它的初始值已给出. 你会依次执行$n$次操作,每次操作有$p\%$的概率令$x=x\times 2$,$(100−p)\%$的概率令$x=x+1$. 假设最后得到的值为$ ...

  9. [CSP-S模拟测试]:简单的玄学(数学)

    题目描述 有$m$个在$[0,2^n)$内均匀随机取值的整型变量,球至少有两个变量取值相同的概率.为了避免精度误差,假设你的答案可以表示成$\frac{a}{b}$的形式,(其中$(a,b)=1$), ...

随机推荐

  1. HDU1846 Brave Game 题解

    题面 本题是一道有向图博弈问题: 该题便是著名的巴什博弈: 我们可以发现,当n=0的时候后手必胜(设其为P态),n=1~m这几种状态由于先手可以一次全部取完导致先手必胜(设其为N态). 接着当n=m+ ...

  2. Android-Widget桌面小组件

    1, 掌握Widget的用:Widget的用途,能够添加到手机桌面的程序 2, Widget的特点和用法步骤: 特点:快捷,方便,个性化,可自定义功能,可及时控制更新Widget显示内容 3, 用法步 ...

  3. layer.prompt绑定确认键

    case 'eventkc': top.layer.prompt({ formType: , title: '修改<span style="color:red">' + ...

  4. qt treeview过滤

    一,不多说直接上代码 QSortFilterProxyModel可实现过滤排序.但是如果直接使用只能对于父项进行过滤 这里需要继承 头文件 #include <QSortFilterProxyM ...

  5. PHP之常用第三方库

    汇总常用的第三方库,方便快速进行开发,避免重复造轮子 1. 时间相关 nesbot/carbon(在编写 PHP 应用时经常需要处理日期和时间,使用Carbon 会很方便– 继承自 PHPDateTi ...

  6. CSS3 @keyframes 实现匀速旋转魔方(搬运工)

    原博文 * https://www.cnblogs.com/shihao905/p/6208324.html * html <div id="wrap"> <di ...

  7. ALV打印不显示打印界面的问题

    用OO的方式screen0 不画屏幕会产生这个问题,解决办法就是不用screen0 要自己画一个区域

  8. func_get_args func_num_args 的使用

    func_get_args是获取方法中参数的数组,返回的是一个数组,与func_num_args搭配使用: func_num_args一般写在方法中,用于计数 function eeee($a='gg ...

  9. mariadb增删改查

    数据库用户的操作 登录前需先启动3306端口. 首次启动需初始化数据库 mysql_secure_installation 增/改: 创建用户及赋予用户指定权限 grant 权限(分为create[创 ...

  10. Java注解Annotation与自定义注解详解

    Java注解简介 开发中经常使用到注解,在项目中也偶尔会见到过自定义注解,今天就来探讨一下这个注解是什么鬼,以及注解的应用场景和如何自定义注解. 下面列举开发中常见的注解 @Override:用于标识 ...