【codeforces 785D】Anton and School - 2
【题目链接】:http://codeforces.com/contest/785/problem/D
【题意】
给你一个长度为n的括号序列;
让你删掉若干个括号之后,整个序列变成前x个括号为左括号,后x个括号为右括号;
问你有多少种删除方法.
【题解】
先考虑一个简单的问题
对于一个括号序列,如果前x个括号都是左括号,后y个括号都是右括号;
((())))
那么这个序列的RSBS的个数为C(X+Y,X)
即相当于构造一个长度为x+y的序列,包含x个1,y个0
如上述括号序列
这里即构造一个长度为7的数字序列,里面含有3个1和4个0
这里选择0对应的左括号和1对应的右括号;
可以发现它们能够构成满足要求的序列
如上图的绿色部分;
这里相当于确定有几个左括号被抵消;
假如有1个左括号对应的数字是1,那么就相应的有3-1个右括号对应的数字是1;
这样刚好和两个左括号对应;
很巧妙的方法吧。
所以这个序列的答案就是C(7,3)
当然上面说的是简化版本的问题;
考虑完整的问题;
我们可以枚举每一个左括号
假设这个左括号是最后的RBSB的括号序列的最后一个左括号;
即这个左括号左边只能是左括号,右边只能是右括号了;
则
我们用前缀和处理出这个左括号前面有多少个左括号,这个左括号后面有多少个右括号;
分别设为x和y;
瞧;
这就变成我们刚才所讨论的问题了;
则答案应该是C(X+Y-1,X),因为这个时候已经确定有一个左括号(即枚举的这个最后一个左括号已经确定了),所以只剩下x+y-1个位置来放那个1了;
这里X+Y会很大;不能写递推式;
只能先求出1..200000的阶乘模和对应的乘法逆元;
然后用C(N,M)=N!/((N-M)!M!)来算
【完整代码】
#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%lld",&x)
#define ref(x) scanf("%lf",&x)
typedef pair<int, int> pii;
typedef pair<LL, LL> pll;
const int dx[9] = { 0,1,-1,0,0,-1,-1,1,1 };
const int dy[9] = { 0,0,0,-1,1,-1,1,-1,1 };
const double pi = acos(-1.0);
const int N = 2e5 + 100;
const LL MOD = 1e9 + 7;
LL fac[N],inv_fac[N],ans;
int l[N], r[N],n;
char s[N];
LL ksm(LL x, LL y)
{
if (y == 1) return x;
LL temp = ksm(x, y >> 1);
temp = (temp*temp)%MOD;
if (y & 1)
temp = (temp*x) % MOD;
return temp;
}
LL C(LL n, LL m)
{
if (n < m) return 0;
return (((fac[n] * inv_fac[n - m]) % MOD)*inv_fac[m]) % MOD;
}
int main()
{
//freopen("F:\\rush.txt", "r", stdin);
fac[0] = 1, inv_fac[0] = 1;
rep1(i, 1, 2e5)
fac[i] = (1LL * fac[i - 1] * i) % MOD, inv_fac[i] = ksm(fac[i], MOD - 2);
scanf("%s", s + 1);
n = strlen(s + 1);
rep1(i, 1, n)
if (s[i] == '(')
l[i] = l[i - 1] + 1;
else
l[i] = l[i - 1];
rep2(i, n, 1)
if (s[i] == ')')
r[i] = r[i + 1] + 1;
else
r[i] = r[i + 1];
rep1(i,1,n)
if (s[i] == '(')
{
ans = (ans + C(l[i] + r[i] - 1, l[i]))%MOD;
}
printf("%lld\n", ans);
//printf("\n%.2lf sec \n", (double)clock() / CLOCKS_PER_SEC);
return 0;
}
【codeforces 785D】Anton and School - 2的更多相关文章
- 【27.91%】【codeforces 734E】Anton and Tree
time limit per test3 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 【29.89%】【codeforces 734D】Anton and Chess
time limit per test4 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 【13.77%】【codeforces 734C】Anton and Making Potions
time limit per test4 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 【81.37%】【codeforces 734B】Anton and Digits
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 【77.39%】【codeforces 734A】Anton and Danik
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 【25.00%】【codeforces 584E】Anton and Ira
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 【codeforces 508B】Anton and currency you all know
[题目链接]:http://codeforces.com/contest/508/problem/B [题意] 给你一个奇数; 让你交换一次数字; 使得这个数字变成偶数; 要求偶数要最大; [题解] ...
- 【codeforces 785E】Anton and Permutation
[题目链接]:http://codeforces.com/problemset/problem/785/E [题意] 给你一个初始序列1..n顺序 然后每次让你交换任意两个位置上面的数字; 让你实时输 ...
- 【codeforces 734F】Anton and School
[题目链接]:http://codeforces.com/problemset/problem/734/F [题意] 给你两个数组b和c; 然后让你找出一个非负数组a满足题中所给关系; [题解] 有个 ...
随机推荐
- YTU 2750: 猜算式
2750: 猜算式 时间限制: 1 Sec 内存限制: 128 MB Special Judge 提交: 22 解决: 1 题目描述 看下面的算式: □□ x □□ = □□ x □□□ 它表示 ...
- [模板] BSGS
BSGS是一种解决一类专门的问题的解法,主要是解决已知A, B, C,求X使得A^x = B (mod p)这一类问题. 解法很简单,先设x = i*m-j(m=ceil(sqrt(p))),然后进行 ...
- codeforces educational round 25
A 出题人不给样例解释...具体程序 #include<bits/stdc++.h> using namespace std; int n; ]; int main() { scanf() ...
- km算法(二分图最大权匹配)学习
啦啦啦! KM算法是通过给每个顶点一个标号(叫做顶标)来把求最大权匹配的问题转 化为求完备匹配的问题的.设顶点Xi的顶标为A[i],顶点Yi的顶标为B[i],顶点Xi与Yj之间的边权为w[i,j].在 ...
- Akka源码分析-Event Bus
akka中的EventBus其实是不常用,也最容易被忽略的一个组件. 但如果你深入Cluster的实现就会发现,这个东西其实还挺有用的,而且它是ActorSystem系统中所有事件消息的一个横切面,通 ...
- C#中Random
说明:C#中的随机数是一个伪随机数,随机数字从一组有限的数字选择以相同的概率,所选的数字不是完全随机的,因为使用数学算法来选择它们.在大多数Windows系统中,Random的15毫秒内创建的对象很可 ...
- Python 如何在csv中定位非数字和字母的符号
在数据清洗过程中,有时不仅希望去掉脏数据,更希望定位脏数据的位置,例如从csv里面定位非数字和字母单元格的位置,在使用isdigit().isalpha().isalnum()时无法判断浮点数,会将浮 ...
- SVN系列学习(四)-TortoiseSVN其他操作
1.新建分支 第一步:从SVN上CheckOut一份,要作为分支模板的文件 第二步:右击[TortoiseSVN]-选择[Branch/tag] 备注说明,[指明分支路径] 第三步:删除电脑上的ZJH ...
- overflow:解决 div的高度塌陷问题
高度塌陷是如何引起的? 解析: 当一个 div中所有的子 div都进行了浮动后,那么会出现该问题,那么解决方就是在父 div中 设置其 overflow:hidden;即可解决高度塌陷问题. 方式 ...
- java DDD 基于maven开发的探讨
对于DDD我目前的理解是 1.除了数据的基本操作,也可以把一些公用的方法或者类迁移到Infrastructrue 2.对于domain层可以声明各个聚合根的操作接口:例:IXXXRepository ...