[CF785D]Anton and School - 2
2017-04-07 16:07
399 查看
题目大意
一个括号序列,问有多少非空子序列是回文合法括号序(这个回文是几何回文,如(()))。瞎做
可以枚举最后一个左括号,假如它左边有A个左括号,右边有B个右括号。贡献为∑Ct−1A∗CtB=∑Ct−1A∗CB−tB
从组合数的意义去考虑,相当于从A+B个数中选B-1个数。
也可以这样考虑。
(1+x)n=∑Cinxi
因此这个就是[xB−1](1+x)A∗(1+x)B=CB−1A+B
#include<cstdio> #include<algorithm> #include<cstring> #define fo(i,a,b) for(i=a;i<=b;i++) #define fd(i,a,b) for(i=a;i>=b;i--) using namespace std; typedef long long ll; const int maxn=200000+10,mo=1000000007; int fac[maxn],inv[maxn]; char s[maxn]; int i,j,k,l,t,n,m,x,y,ans; int quicksortmi(int x,int y){ if (!y) return 1; int t=quicksortmi(x,y/2); t=(ll)t*t%mo; if (y%2) t=(ll)t*x%mo; return t; } int C(int n,int m){ if (n<m||m<0) return 0; return (ll)fac *inv[m]%mo*inv[n-m]%mo; } int main(){ scanf("%s",s+1); n=strlen(s+1); fac[0]=1; fo(i,1,n) fac[i]=(ll)fac[i-1]*i%mo; inv =quicksortmi(fac ,mo-2)%mo; fd(i,n-1,0) inv[i]=(ll)inv[i+1]*(i+1)%mo; fo(i,1,n) y+=(s[i]==')'); fo(i,1,n){ if (s[i]=='('){ (ans+=C(x+y,y-1))%=mo; x++; } else y--; } (ans+=mo)%=mo; printf("%d\n",ans); }
相关文章推荐
- Codeforces Round #404 (Div. 2) D. Anton and School - 2(组合数学)
- Codeforces Round #379 (Div. 2) F. Anton and School
- Codeforces Round #404(Div. 2)D. Anton and School - 2【组合数学+思维】好题!好题!
- cf 734F Anton and School
- Codeforces Round #379 (Div. 2) F. Anton and School
- Codeforces Round #379 (Div. 2) F. Anton and School
- Codeforces Round #404 (Div. 2) D. Anton and School - 2 前缀的后缀、 范德蒙恒等式、容斥
- 【组合数】【乘法逆元】 Codeforces Round #404 (Div. 2) D. Anton and School - 2
- Anton and School - 2 (组合数学)
- CodeForces 785D Anton and School - 2 组合数学
- Codeforces 785D - Anton and School - 2(范德蒙恒等式+逆元)
- Codeforces Round #379 (Div. 2) F. Anton and School
- Codeforces785 D. Anton and School - 2 组合数学
- codeforces 785 D Anton and School - 2(组合数学)
- codeforces 785 D. Anton and School - 2
- 【codeforces 785D】Anton and School - 2
- [codeforces 734F]Anton and School
- Codeforces Round #404 (Div. 2) D. Anton and School - 2 [范德蒙恒等式]
- 数学(Anton and School,cf 734F)
- #404 (div2)Anton and School - 2