[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++

原文地址:https://www.cnblogs.com/wzc521/p/11730090.html

时间: 2024-10-09 15:41:05

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

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

题目描述 给定一个长度为$n$的序列$a$以及常数$k$,序列从$1$开始编号.记$$f(l,t)=\sum \limits_{i=l}^ra_i-\max \limits_{i=l}^r\{a_i\}$$求合法的正整数对$(l,r)$的数量,满足$1\leqslant l<r\leqslant n$,且$k|f(l,r)$. 输入格式 第一行两个正整数$n$和$k$. 第二行包含$n$个正整数,第$i$个正整数表示$a_i$. 输出格式 一行一个正整数,表示答案. 样例 样例输入1: 4 3

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

题目描述 对于一个长度为$n$,且下标从$1$开始编号的序列$a$,我们定义它是「合法的」,当且仅当它满足以下条件:·$a_1=1$·对于$i\in [1,n),a_i\leqslant a_{i+1}\leqslant a_i+1$且$a_{i+1}$为正整数·对于任意在$a$中出现过的数$v$,记它的出现次数为$s$,则$2\leqslant s\leqslant 5$给定一个长度为$n$的序列$a$,其中有一些位置为$0$,你需要在这些位置上任意填数,使得$a$成为一个合法的序列,并且最大

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

题面:https://www.cnblogs.com/Juve/articles/11602244.html 平均数: 第k个平均数不好求,我们考虑二分,转化成平均数小于x的有几个 虑把序列中的每个数减去 x,则我们只需求区间和小于 0 的区间数量. 我们对这个序列求前缀和,则区间[L,R]和小于 0 当且仅当 SL-1>SR, 答案即为前缀和序列 S 的逆序对数量,使用经典的归并排序即可解决 #include<iostream> #include<cstdio> #incl

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

题目描述 有$m$个在$[0,2^n)$内均匀随机取值的整型变量,球至少有两个变量取值相同的概率.为了避免精度误差,假设你的答案可以表示成$\frac{a}{b}$的形式,(其中$(a,b)=1$),你需要输出$a$和$b$对${10}^6+3$取模后的值. 输入格式 第一行两个正整数$n,m$. 输出格式 一行两个整数,它们的含义如题所述. 样例 样例输入1: 3 2 样例输出1: 1 8 样例输入2: 1 3 样例输出2: 1 1 样例输入3: 4 3 样例输出3: 23 128 数据范围与

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

题目描述 从前有个变量$x$,它的初始值已给出. 你会依次执行$n$次操作,每次操作有$p\%$的概率令$x=x\times 2$,$(100−p)\%$的概率令$x=x+1$. 假设最后得到的值为$w$,令$d$为$w$的质因数分解中$2$的次数,求$d$的期望. 输入格式 从文件$exp.in$中读入数据. 第一行三个整数$x,n,p$,含义见题目描述. 输出格式 输出到文件$exp.out$中. 一行一个实数,表示$d$的期望. 如果你的答案与标准答案的误差不超过$10^{−6}$,则判定

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

题目描述 从前有个包含$n$个点,$m$条边,无自环和重边的无向图. 对于两个没有直接连边的点$u,v$,你可以将它们合并.具体来说,你可以删除$u,v$及所有以它们作为端点的边,然后加入一个新点$x$,将它与所有在原图中与u或v有直接连边的点连边. 你需要判断是否能通过若干次合并操作使得原图成为一条链,如果能,你还需要求出这条链的最大长度. 输入格式 从文件$merge.in$中读入数据. 第一行两个正整数$n,m$,表示图的点数和边数. 接下来m行,每行两个正整数$u,v$,表示$u$和$v

csp-s模拟测试83(集训过半)

csp-s模拟测试83(集训过半) 一场信心赛.起初$OJ$爆了我就看见全场$A$了$T1$并且夹杂着$A$掉$T2$我就很难受. 这场比赛没有深入思考,很失败,一个多小时后就结束了我罪恶的一生. 100 00:44:43 50 02:51:09 20 02:50:48 170 02:51:09 没什么水平暴力都没打满. A. 最大异或和 打表可知异或$sum$为$0$则平局反之先手必胜. B. 简单的括号序列 $B$组的一道垃圾题.记得考虑柿子的实际含义就好了. C. 旅行计划 分块处理,考场

模拟测试20191023

$morning$ $T1:最大异或和$ 设$sum$=$a_{1}$^$a_{2}$^......^$a_{n}$, 转化题意,相当于小$T$初始权值为$sum$,小$Q$初始权值为$0$,可以选不相连的点两个人同时异或这个点的权值 从高到低$sum$二进制下某一位,如果是$0$,那么小$Q$和小$T$在这一位上一定相等 如果是$1$,那么必须选一个这一位上是$1$的点小$Q$才能大于小$T$ 而如果$sum$这一位是$1$,那么至少一个点这一位上是$1$ 则题意转化为如果$sum>0$,则输

LintCode Python 简单级题目 423.有效的括号序列

题目描述: 给定一个字符串所表示的括号序列,包含以下字符: '(', ')', '{', '}', '[' and ']', 判定是否是有效的括号序列. 您在真实的面试中是否遇到过这个题? Yes 样例 括号必须依照 "()" 顺序表示, "()[]{}" 是有效的括号,但 "([)]"则是无效的括号. 标签 栈 谷歌 题目分析: 循环字符串,遇左括号入栈. 遇右括号,从栈顶取元素然后配对,判断配对结果. 最后再判断栈是否不为空. 源码: cla