[CSP-S模拟测试]:简单的括号序列(组合数)
题目传送门(内部题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模拟测试]:简单的括号序列(组合数)的更多相关文章
- csps模拟83最大异或和简单的括号序列旅行计划题解
题面:https://www.cnblogs.com/Juve/articles/11733280.html 最大异或和: 简单博弈,小Q一定不会输,如果异或和为0,则平局,因为无论小Q如何拿,小T都 ...
- [CSP-S模拟测试]:简单的序列(DP)
题目描述 从前有个括号序列$s$,满足$|s|=m$.你需要统计括号序列对$(p,q)$的数量. 其中$(p,q)$满足$|p|+|s|+|q|=n$,且$p+s+q$是一个合法的括号序列. 输入格式 ...
- [CSP-S模拟测试]:简单的填数(贪心+模拟)
题目描述 对于一个长度为$n$,且下标从$1$开始编号的序列$a$,我们定义它是「合法的」,当且仅当它满足以下条件:·$a_1=1$·对于$i\in [1,n),a_i\leqslant a_{i+1 ...
- [CSP-S模拟测试]:简单的区间(分治)
题目描述 给定一个长度为$n$的序列$a$以及常数$k$,序列从$1$开始编号.记$$f(l,t)=\sum \limits_{i=l}^ra_i-\max \limits_{i=l}^r\{a_i\ ...
- csp-s模拟测试52平均数,序列题解
题面:https://www.cnblogs.com/Juve/articles/11602244.html 平均数: 第k个平均数不好求,我们考虑二分,转化成平均数小于x的有几个 虑把序列中的每个数 ...
- [CSP-S模拟测试]:简单计算(数学)
题目传送门(内部题104) 输入格式 第一行一个正整数$T$,表示该测试点内的数据组数,你需要对该测试点内的$T$组数据都分别给出正确的答案才能获得该测试点的分数. 接下来$T$组数据,每组数据一行两 ...
- [CSP-S模拟测试]:简单的操作(二分图+图的直径)
题目描述 从前有个包含$n$个点,$m$条边,无自环和重边的无向图. 对于两个没有直接连边的点$u,v$,你可以将它们合并.具体来说,你可以删除$u,v$及所有以它们作为端点的边,然后加入一个新点$x ...
- [CSP-S模拟测试]:简单的期望(DP)
题目描述 从前有个变量$x$,它的初始值已给出. 你会依次执行$n$次操作,每次操作有$p\%$的概率令$x=x\times 2$,$(100−p)\%$的概率令$x=x+1$. 假设最后得到的值为$ ...
- [CSP-S模拟测试]:简单的玄学(数学)
题目描述 有$m$个在$[0,2^n)$内均匀随机取值的整型变量,球至少有两个变量取值相同的概率.为了避免精度误差,假设你的答案可以表示成$\frac{a}{b}$的形式,(其中$(a,b)=1$), ...
随机推荐
- 为什么只有ip地址和端口号需要主机字节序到网络字节序的转换?
答复是:因为内容是二进制流,不是整数. 整数(int.uint16.uint32)的表达,是需要多字节的,在不同cpu上,字节次序是不同的.因此,从A主机到B主机,如果是异构的,就需要做字节调整.同构 ...
- 异步任务报错-Celery: WorkerLostError: Worker exited prematurely: signal 9 (SIGKILL)
现象: 异步任务: 测试环境正常,线上环境报错 使用celery 进行后端异步任务时,报错: Celery: WorkerLostError: Worker exited prematurely: s ...
- ubuntu下python3虚拟环境的配置
安装相关包 sudo pip3 install virtualenv # 虚拟环境包 sudo pip3 install virtualenvwrapper # 虚拟环境管理包 创建虚拟环境目录 su ...
- 3.学习Dispatcher
3.学习Dispatcher 不管是WinForm应用程序还是WPF应用程序,实际上都是一个进程,一个进程可以包含多个线程,其中有一个是主线程,其余的是子线程. 在WPF或WinForm应用程序中,主 ...
- Jquery复习(二)之stop()易忘点
jQuery stop() 方法 jQuery stop() 方法用于停止动画或效果,在它们完成之前. stop() 方法适用于所有 jQuery 效果函数,包括滑动.淡入淡出和自定义动画. 语法:$ ...
- 剑指offer 数字翻译成字符串
0 -> 'a', 1->'b', ..., 11 -> 'l', ..., 25->'z'. 计算一个数有多少种不同的翻译方法. 分析:记f[i]表示从第i位起的不同翻译数目 ...
- luogu P4076 [SDOI2016]墙上的句子
luogu loj 题意看了我半天(逃 (应该是我语文太差了) 题意是要确定每一行和每一列的看单词的顺序,使得同时正着出现和反着出现在里面的单词数量最少,每行和每列的性质是这一行所有单词反过来的单词要 ...
- SQL注入的一些技巧分享
先上一道简单的ctf注入题: 一道利用order by进行注入的ctf题 很不错的一道利用order by的注入题,之前不知道order by除了爆字段还有这种操作. 原题地址:http://chal ...
- div悬浮在屏幕的中间及点击按钮关闭弹出框
#fd { position: fixed; z-index: 999; width: 109px; height: 323px; top: 71%; right: 1%; margin: -50px ...
- 2019-11-29-Roslyn-通过-Nuget-管理公司配置
title author date CreateTime categories Roslyn 通过 Nuget 管理公司配置 lindexi 2019-11-29 08:58:52 +0800 201 ...