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",stdout);
#define LL long long
#define ULL unsigned LL
#define fi first
#define se second
#define pb push_back
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define lch(x) tr[x].son[0]
#define rch(x) tr[x].son[1]
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
typedef pair<int,int> pll;
const int inf = 0x3f3f3f3f;
const int _inf = 0xc0c0c0c0;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const LL _INF = 0xc0c0c0c0c0c0c0c0;
const LL mod =  (int)1e9+7;
const int N = 2e5 + 100;
int F[N], Finv[N], inv[N];/// F是阶层 Finv是逆元的阶层
void init(){
    inv[1] = 1;
    for(int i = 2; i < N; i++)
        inv[i] = (mod - mod/i) * 1ll * inv[mod % i] % mod;
    F[0] = Finv[0] = 1;
    for(int i = 1; i < N; i++){
        F[i] = F[i-1] * 1ll * i % mod;
        Finv[i] = Finv[i-1] * 1ll * inv[i] % mod;
    }
}
int comb(int n, int m){ /// C(n,m)
    if(m < 0 || m > n) return 0;
    return F[n] * 1ll * Finv[n-m] % mod * Finv[m] % mod;
}
char s[N];
int l[N], r[N];
int main(){
    scanf("%s", s+1);
    int n = strlen(s+1);
    for(int i = 1; i <= n; ++i){
        if(s[i] == ‘(‘) l[i]++;
        l[i] += l[i-1];
    }
    for(int i = n; i >= 1; --i){
        if(s[i] == ‘)‘) r[i]++;
        r[i] += r[i+1];
    }
    LL ans = 0;
    init();
    for(int i = 1; i <= n; ++i){
        if(s[i] == ‘(‘){
            ans = (ans + comb(l[i]-1+r[i], l[i]))%mod;
        }
    }
    cout << ans << endl;
    return 0;
}

原文地址:https://www.cnblogs.com/MingSD/p/10853280.html

时间: 2024-10-09 17:51:12

CodeForces 785 D Anton and School - 2 范德蒙恒等式的相关文章

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 785 E. Anton and Permutation(分块,树状数组)

Codeforces 785 E. Anton and Permutation 题目大意:给出n,q.n代表有一个元素从1到n的数组(对应索引1~n),q表示有q个查询.每次查询给出两个数l,r,要求将索引为l,r的两个数交换位置,并给出交换后数组中的逆序对数. 思路:此题用到了分块的思想,即将这组数分为bsz块,在每一块上建Fenwick树,对于每次查询,只需要处理l,r中间的块和l,r所在块受影响的部分.具体实现见代码及注释. #include<iostream> #include<

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 j

范德蒙恒等式

[范德蒙恒等式] 甲班有个同学,乙班有个同学,从两个班中选出个一共有种不同的选法.而换一种思维方式从甲班中选取个同学,从乙班中选取个同学,共有种方法,而对所有的就是范德蒙恒等式. 下面的形式也叫范德蒙恒等式.是特殊形式.此形式中,k=n=m.

范德蒙恒等式的证明

今天我们来认识组合数学中一个重要的恒等式---范德蒙恒等式.这个恒等式的表述如下 很自然的公式,接下来一起来看看它的证明,在维基百科上给出了两种方法证明,分别如下 (1)组合方法证明     甲班有个同学,乙班有个同学,从两个班中选出个一共有种不同的选法.而换一种思维方式 从甲班中选取个同学,从乙班中选取个同学,共有种方法,而对所有的 就是 可以看出这两种方法应该是相等的,即 (2)生成函数法证明 由于,对于等式左边有 而对于等式右边有 左右两边一比较可知 成立,证明完毕! 接下来我们看看一些关

6476. 【GDOI2020模拟02.19】A(范德蒙恒等式)

题目描述 题解 镇♂男则反 容斥下界,上界开到大概505位,数位dp最终的和V 设边界(要大于边界)之和为S,那么答案为C(V-S-1,n-1) 根据范德蒙恒等式,C(n+m,k)=∑C(n,i)*C(m,k-i) 如果nm都是正数很好证明,把n+m分成n和m两部分,枚举n部分选择个数组合一下 这个式子其实可以拓展到负数,证明要用生成函数 关于n为负数的组合数:\(C(n,m)=n^{\underline{m}}/m!\),其实和正数时是一样的 (注意这只是为了计算范德蒙恒等式而扩展的,在一般情

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

浅谈范德蒙德(Vandermonde)方阵的逆矩阵与拉格朗日(Lagrange)插值的关系以及快速傅里叶变换(FFT)中IDFT的原理 只要稍微看过一点线性代数的应该都知道范德蒙德行列式. \[V(x_0,x_1,\cdots ,x_{n-1})=\begin{bmatrix} {1}&{1}&{\cdots}&{1}\{x_{0}}&{x_{1}}&{\cdots}&{x_{n-1}}\{x_{0}^2}&{x_{1}^2}&{\cdots

codeforces 785D D. Anton and School - 2

题目链接:http://codeforces.com/problemset/problem/785/D 题意:给你一个只包含'('和')'的字符串,然后问他的子序列中有多少满足前一半是左括号,后一半是右括号. 分析:看到题就想到是组合数学,对于一个左括号,他能影响到的右括号就是他后边的,因此,你需要求前缀和和后缀和,来这样来求组合数.现在我们枚举左括号,当枚举到他时,代表他一定被选,前缀和为n,后缀和为m,然后在他前边选i=0到min(n,m)-1个,在他后边选前边数+1个.然后就是C(n-1,

范德蒙行列式

首先,在讲范德蒙行列式之前,先看下一个具体的例子,如下图是一个四阶行列式, 我们能观察出来,从第四行开始,后行减去前行的2倍: 需要特别注意的是,各个运算次序不能颠倒,这是因为后一次运算是作用在前一次运算的结果上的缘故. 后面的步骤与方法,与前面的相似,后行减掉前行的n倍(n根据具体的数字来确定),重复这样的步骤方法算降阶到2阶行列式,就可得出答案,答案为,(4-2)*(7-2)*(9-2)*(7-4)*(9-4)*(9-7)=2100: 根据以上的例子,再采用数学归纳法,可以证明得出形如像如下