CF785D Anton and School - 2 解题报告
CF785D Anton and School - 2
题意:给定一个长度\(\le 2 \times 10e5\)由'('和')'组成的字符串,问有多少个子串(可以不连续),前半部分是由\('('\)组成后半部分由\(')'\)组成.
考虑枚举每一个可能的字串的中间,然后统计两边
先预处理每一个位置前面有多少个\('('\),后面有多少个\(')'\)
然后枚举每一个\('('\)表示中间且必选
设当前位(包括)有\(a\)个\('('\)
则对此位置的答案即为\(\sum_{i=0}^{min(a-1,b-1)} C_{a-1}^i \times C_b^{i+1}\)
引理:范德蒙恒等式,\(\sum_{i=0}^k C_a^i \times C_b^{k-i}=C_{a+b}^k\)
对上式进行化简即可得 \(C_{a+b-1}^a\)
预处理阶乘和阶乘逆元即可
Code:
#include <cstdio>
#include <cstring>
#define ll long long
const int N=200010;
const ll mod=1e9+7;
ll t[N],f1[N],f2[N],fac[N],inv[N],n,ans;
char c[N];
ll quick_pow(ll d,ll k)
{
    ll f=1;
    while(k)
    {
        if(k&1)
            f=f*d%mod;
        d=d*d%mod;
        k>>=1;
    }
    return f;
}
ll C(ll a,ll b)
{
    if(a>b) return 0;
    if(inv[b-a]==-1) inv[b-a]=quick_pow(fac[b-a],mod-2);
    if(inv[a]==-1) inv[a]=quick_pow(fac[a],mod-2);
    return fac[b]*inv[b-a]%mod*inv[a]%mod;
}
int main()
{
    memset(inv,-1,sizeof(inv));
    scanf("%s",c);
    n=strlen(c);
    for(int i=0;i<n;i++)
        t[i+1]=(c[i]==')');
    for(int i=1;i<=n;i++)
        f1[i]=f1[i-1]+!t[i];
    for(int i=n;i;i--)
        f2[i]=f2[i+1]+t[i];
    fac[0]=1;
    for(int i=1;i<=n;i++)
        fac[i]=fac[i-1]*i%mod;
    for(int i=1;i<=n;i++)
        if(!t[i])
        {
            ll a=f1[i],b=f2[i];
            (ans+=C(a,a+b-1))%=mod;
        }
    printf("%lld\n",ans);
    return 0;
}
2018.7.19
CF785D Anton and School - 2 解题报告的更多相关文章
- CH Round #56 - 国庆节欢乐赛解题报告
		最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ... 
- 二模13day1解题报告
		二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ... 
- BZOJ 1051 最受欢迎的牛 解题报告
		题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4438 Solved: 2353[S ... 
- 习题:codevs  2822 爱在心中 解题报告
		这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ... 
- 习题:codevs 1035 火车停留解题报告
		本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ... 
- 习题: codevs 2492 上帝造题的七分钟2 解题报告
		这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ... 
- 习题:codevs 1519 过路费 解题报告
		今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ... 
- NOIP2016提高组解题报告
		NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合 
- LeetCode 解题报告索引
		最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中...... ... 
随机推荐
- docker error:/root/.docker/config.json: is a directory
			问题: 本地没有taskworker镜像,docker从远端拉取,但是拉取时需要读取config.json配置,解析配置时,发现config.json是个目录,错误信息如下: taskworker_1 ... 
- 深入解析QML引擎, 第3部分: 绑定类型
			原文 QML Engine Internals, Part 3: Binding Types 译者注:这个解析QML引擎的文章共4篇,分析非常透彻,在国内几乎没有找到类似的分析,为了便于国内的QT/Q ... 
- C#是数据类型
			C#又开始了 开始数据类型 用的软件是VS2017 E short 短整型 int 中等整型 long 长整形 string 字符串类型 bool 布尔类型(true/flase) 相当于数 ... 
- T-SQL语句基础
			连接服务器 - 去哪个仓库找目标数据库 - 找仓库中的目标区域查找目标表 - 找货柜找数据(以行为基础单位) - 在货柜上找到目标的物品 基础T-Sql语句1.SQL语句的注释 2.创建数据库crea ... 
- 函数parseQuery用于解析url查询参数
			在百度上找的,以后忘了再看. 语法如下: var obj = parseQuery(query) query是被解析的查询参数,函数返回解析后的对象. 使用范例如下: var jerry = pars ... 
- 【Jmeter测试】BeanShell介绍和使用
			BeanShell是什么? BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法; BeanShell是一种松散类型的脚本语言: BeanShell是用Jav ... 
- Activity 在横竖屏切换情况下的生命周期变化
			title: Activity 在横竖屏切换情况下的生命周期变化 date: 2018-04-26 23:05:57 tags: [Activity] categories: [Mobile,Andr ... 
- Centos 7 zabbix 实战应用
			实际需求:公司已经有了100台服务器,现在需要使用zabbix全部监控起来. 先出个方案(规划) 常规监控:cpu,内存,磁盘,网卡 问题:怎样快速添加100台机器 方法1:使用克隆的 ... 
- ionic 开发实例
			ionic 开发实例 一.ionic初始化项目 1:安装ionic npm install -g ionic 2:初始化项目框架 我们可以用命令创建一个应用程序,可以使用我们的一个现成的应用程序模板, ... 
- Android 6.0 中的 Wifi 连接
			Android 6.0 中的 Wifi 连接 这几天在写一个软件,结果被其中的 wifi 连接问题困扰了 3 天. 先描述下需求: usb 接口接了一根 usb2serial,通过这个接口接收命令 当 ... 
