1.题目链接。题目大意:一个由括号构成的序列,让你找到这个序列中有多少个好的子序列。一个好的子序列的定义是这样的:

2.分析:这个题是一个组合数学问题。对于每一个'(',我们统计它的左边有多少个和它相同的,右边有多少个和它相对的。也就是在这个左括号的左边选出i个左括号,右边选出i+1个右括号。(为什么是i+1,因为当前的括号是左括号,加上左边i个,所以右边需要有i+1个与之匹配)所以我们枚举这个i,就可以知道当前这个位置对答案的贡献。那么当前这个位置对答案的贡献就是:

根据组合数的性质:C(n,i)=C(n,n-i).我们可以把后边的式子改写成:

这个式子是可以用范德蒙恒等式化简的:

范德蒙恒等式:

这个式子的证明很简单,考虑一个多项式:

其中x的k次幂:就是右边的式子,如果我们把 这个多项式拆解成:

那么对于右边的式子:我们再考录x的k次方,即可得到范德蒙恒等式。

那么对于我们的上边的式子可以做出一下化简:

这样对于每一个点,我们在预处理之后,就可以O(1)的计算这个点对答案的贡献。代码如下:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 200010;
const int mod = 1e9 + 7;
char s[maxn];
int l[maxn], r[maxn];
#pragma warning(disable:4996)
ll qpow(ll a, ll b, ll mod)
{ll res = 1;while (b){if (b & 1)res = res * a%mod;a = a * a%mod;b >>= 1;}return res;
}
ll fac[maxn] = { 1,1 }, inv[maxn] = { 1,1 }, f[maxn] = { 1,1 };
ll c(ll a, ll b)
{return fac[b] * inv[a] % mod*inv[b - a] % mod;
}
void init()
{for (int i = 2; i < maxn; i++) {fac[i] = fac[i - 1] * i%mod;f[i] = (mod - mod / i)*f[mod%i] % mod;inv[i] = inv[i - 1] * f[i] % mod;}
}
int main()
{scanf("%s", s);int len = strlen(s);l[0] = (s[0] == '(');r[len - 1] = (s[len - 1] == ')');for (int i = 1; i < len; i++)l[i] = l[i - 1] + (s[i] == '(');for (int i = len - 2; i >= 0; i--)r[i] = r[i + 1] + (s[i] == ')');init();ll ans = 0;for (int i = 0; i < len; i++){if (s[i] == '('){ans = (ans + c(r[i] - 1, l[i] + r[i] - 1));ans %= mod;}}printf("%lld\n", ans);
}

【Codeforces 785D】范德蒙恒等式相关推荐

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

    题目传送门:Problem - 785D - Codeforces As you probably know, Anton goes to school. One of the school subj ...

  2. 【校内模拟】A(容斥原理)(数位DP)(范德蒙德恒等式)(高精度)

    简要题意: 请你对满足下列条件的正整数序列 A1,A2⋯AnA_1,A_2\cdots A_nA1​,A2​⋯An​ 进行计数. ∀1≤i≤n,Li≤Ai≤Ri\forall 1\leq i\leq ...

  3. 范德蒙德矩阵在MATLAB中怎么表示,Python 之 Python与MATLAB 矩阵操作总结

    Python 之 Python与MATLAB 矩阵操作小结 一.线形代数理论基础 线形代数(linear algebra)是数学的一个分支,研究矩阵理论.向量空间.线性变换和有限维线形方程组等内容. ...

  4. 1960 范德蒙矩阵(数学贪心)

    1960 范德蒙矩阵 LYK最近在研究范德蒙矩阵与矩阵乘法,一个范德蒙矩阵的形式如下: 它想通过构造一个含有1~nm的n*m的矩阵G,使得G*V得到的n*n的矩阵T中所有位置上的元素之和最大.其中n, ...

  5. 洛谷·幼儿园篮球题【including范德蒙德卷积,二项式反演

    初见安~时隔良久我又回来写多项式了[靠 还是放在题目前面吧,简单讲一下这两个东西. 一.范德蒙德卷积 可以理解为:在两个有n个石子和m个石子的堆里面共选k个石子的方案数.这样这个等式的成立就很显然了. ...

  6. 半正定Toeplitz矩阵的范德蒙德分解

    半正定Toeplitz矩阵的范德蒙德分解 Toeplitz矩阵的定义:Matrices whose entries are constant along each diagonal are calle ...

  7. 范德蒙德和Teoplitz方程组的解法

    范德蒙德和Teoplitz方程组的解法 简单介绍 工程中的很多实际问题的处理,比如说图像处理的某些情况,最后往往归结为比较容易处理的Vandermonde方程组和Teoplitz方程组的求解问题,因此 ...

  8. C语言二维数组范德蒙,浅谈范德蒙德(Vandermonde)方阵的逆矩阵的求法以及快速傅里叶变换(FFT)中IDFT的原理...

    浅谈范德蒙德(Vandermonde)方阵的逆矩阵与拉格朗日(Lagrange)插值的关系以及快速傅里叶变换(FFT)中IDFT的原理 标签: 行列式 矩阵 线性代数 FFT 拉格朗日插值 只要稍微看 ...

  9. 浅谈范德蒙德(Vandermonde)方阵的逆矩阵的求法以及快速傅里叶变换(FFT)中IDFT的原理...

    浅谈范德蒙德(Vandermonde)方阵的逆矩阵与拉格朗日(Lagrange)插值的关系以及快速傅里叶变换(FFT)中IDFT的原理 标签: 行列式 矩阵 线性代数 FFT 拉格朗日插值 只要稍微看 ...

最新文章

  1. 区块链相关论文研读4: Monoxide异步共识组
  2. Silverlight实用窍门系列:40.Silverlight中捕捉视频,截图保存到本地
  3. elasticSearch6源码分析(2)模块化管理
  4. mysql5.7 忘记root密码后,如何找回密码?
  5. CentOS7下PHPNginxMysql编译安装及sytemd配置
  6. 插入网站连接_带你了解网站设计的五个基本步骤
  7. mysql sql长度限制_SQL限制– MySQL限制
  8. Silverlight实用窍门系列:51.Silverlight页面控件的放大缩小、Silverlight和Html控件的互相操作【附带源码实例】...
  9. javascript创建对象的几种方式
  10. android pdf阅读器推荐,Android最强PDF阅读器 十款软件大PK
  11. putty远程linux系统时间修改,使用putty远程linux服务
  12. 如何进入DOS系统 | 常用DOS系统命令
  13. 每天吃一碗,肾不好都不行!
  14. 邮件营销和网络广告的价值
  15. python求平均数直到0出现while_Python第一周 学习笔记(2)
  16. 代码审计工具简单汇总
  17. Java实现 蓝桥杯 算法训练 相邻数对(暴力)
  18. [转载]人人旗下风车网产品经理的创业失败教训总结
  19. js判断手机是苹果(IOS)还是安卓(android)
  20. 无人出租赛道洗牌开启?这家公司为什么会黄?

热门文章

  1. (四)Java游戏部署在BlackBerry仿真器上(RIM)
  2. Android GridView的使用
  3. ftp 自动下载文件并解压
  4. 虚拟机克隆后mac地址冲突,上不了网问题解决记录
  5. 尤雨溪和Vue的那些事
  6. java web.xml taglib_web.xml配置文件 taglib
  7. 服务器拒收的文件cpc,放弃实用新型cpc-实用新型专利服务器拒收的文件如何编辑?...
  8. 高等数学计算机专用作业,高等数学II(计算机1901-1902)-中国大学mooc-题库零氪...
  9. basler 虚拟相机的使用
  10. 力扣高频|算法面试题汇总(七):树