CF #404 (Div. 2) D. Anton and School - 2 (数论+范德蒙恒等式)

题意:给你一个由‘(‘和‘)‘组成的字符串,问你有多少个子串,前半部分是由‘(‘组成后半部分由‘)‘组成

思路:枚举这个字符串中的所有‘(‘左括号,它左边的所有‘(‘左括号的个数为num1,它的右边的所有’)‘右括号的个数为num2,

根据范德蒙恒等式计算得出

代码:

#include <bits/stdc++.h>
#define ll long long
#define maxn 200000
#define mod 1000000007
using namespace std;

ll jc[maxn+5];

void get_jc()
{
    jc[0]=1;
    for(int i=1;i<=maxn;i++)
    {
        jc[i]=(jc[i-1]*i)%mod;
    }
}

ll qmod(ll a,ll b)
{
    ll ans=1;
    while(b)
    {
        if(b%2==1)
        {
            ans=(ans*a)%mod;
        }
        b=b/2;
        a=(a*a)%mod;
    }
    return ans;
}

ll get_C(ll m,ll n)
{
    return (jc[m]*qmod((jc[m-n]*jc[n])%mod,mod-2))%mod;
}

int main()
{
    string data;
    int num1[maxn+5],num2[maxn+5];
    get_jc();
    while(cin>>data)
    {
        int p=0;
        for(int i=0;i<data.length();i++)
        {
            if(data[i]==‘(‘)
            {
                p++;
            }
            num1[i]=p;
        }
        p=0;
        ll ans=0;
        for(int i=data.length()-1;i>=0;i--)
        {
            if(data[i]==‘)‘)
            {
                p++;
            }
            num2[i]=p;
        }
        for(int i=0;i<data.length();i++)
        {
            if(data[i]==‘(‘)
            {
                ans=(ans+get_C(num1[i]+num2[i]-1,num2[i]-1))%mod;
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}
时间: 2024-10-14 16:59:17

CF #404 (Div. 2) D. Anton and School - 2 (数论+范德蒙恒等式)的相关文章

CodeForces 785 D Anton and School - 2 范德蒙恒等式

Anton and School - 2 题解: 枚举每个左括号作为必选的. 那么方案数就应该是下面的 1 , 然后不断化简, 通过范德蒙恒等式 , 可以将其化为一个组合数. 代码: #include<bits/stdc++.h> using namespace std; #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdou

D. Anton and School - 2 范德蒙恒等式

As you probably know, Anton goes to school. One of the school subjects that Anton studies is Bracketology. On the Bracketology lessons students usually learn different sequences that consist of round brackets (characters "(" and ")" (w

Codeforces Round #404 (Div. 2) C 二分,水 D 数学,好题 E 分块

Codeforces Round #404 (Div. 2) C. Anton and Fairy Tale 题意:仓库容量n,每天运来m粮食,第 i 天被吃 i 粮食,问第几天仓库第一次空掉. tags:==SB题 注:二分边界判断,数据范围爆long long判断. // CF404 C #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000&

Codeforces Round #404 (Div. 2) ---d

D. Anton and School - 2 这题第一眼一直觉得是dp,然而到最后他竟然是个数学题2333 考虑暴力,我们枚举一个'(',来求选他的情况下方案数有多少,那么事实上我们就是要在该位置左边选取i个'(',在其右边选取i+1个')',可以保证不重不漏.暴力的话On统计即可.那么就是要化简组合数的求和.即C(n,i)*C(m,i+1) (0<=i<=min(n,m-1)) 我们发现C(m,i+1)=C(m,m-i-1) 而i+(m-i-1)是定值. 也就是说变成了现在前n个数中选i个

CF #371 (Div. 2) C、map标记

1.CF #371 (Div. 2)   C. Sonya and Queries  map应用,也可用trie 2.总结:一开始直接用数组遍历,果断T了一发 题意:t个数,奇变1,偶变0,然后与问的匹配. #include<bits/stdc++.h> #define max(a,b) a>b?a:b #define F(i,a,b) for (int i=a;i<=b;i++) #define mes(a,b) memset(a,b,sizeof(a)) #define INF

CF#247(Div. 2)部分题解

引言: 在软件项目中,Maven提供了一体化的类库管理系统,非常实用.但是,如果新增的类库jar在网络上无法获取到,如何在本地按照Maven的规则添加进来呢?本文将通过一个小例子展示新增过程. 背景介绍: 一个Maven管理的Java项目,提供一个系统级别的POM.xml,其中定义了整个项目使用的类库. 需求: 需要添加一个自定义的类库到当前项目中.假定当前的类库文件名为:abc.jar.. 如何将类库添加进来? 1.  找到当前Maven的Repository类库位置 一般默认情况下,在win

CF #375 (Div. 2) D. bfs

1.CF #375 (Div. 2)  D. Lakes in Berland 2.总结:麻烦的bfs,但其实很水.. 3.题意:n*m的陆地与水泽,水泽在边界表示连通海洋.最后要剩k个湖,总要填掉多少个湖,然后输出. #include<bits/stdc++.h> #define F(i,a,b) for (int i=a;i<b;i++) #define FF(i,a,b) for (int i=a;i<=b;i++) #define mes(a,b) memset(a,b,s

CF #374 (Div. 2) D. 贪心,优先队列或set

1.CF #374 (Div. 2)   D. Maxim and Array 2.总结:按绝对值最小贪心下去即可 3.题意:对n个数进行+x或-x的k次操作,要使操作之后的n个数乘积最小. (1)优先队列 #include<bits/stdc++.h> #define F(i,a,b) for (int i=a;i<b;i++) #define FF(i,a,b) for (int i=a;i<=b;i++) #define mes(a,b) memset(a,b,sizeof(

cf #254 (Div. 2)

a题 #include<stdio.h> #include<string.h> char c[101][101]; int main() { long n,m,i,j; scanf("%ld%ld",&n,&m); gets(c[0]); for(i=1;i<=n;i++) gets(c[i]); for(i=1;i<=n;i++) { for(j=0;j<m;j++) if(c[i][j]=='-') printf("