范德蒙德恒等式
考虑统计每一个右括号位置的贡献,也就是每个右括号作为右边起点的贡献
其中i=0的时候,r-1<r-0,故i=0时贡献为0,直接套用恒等式不会有影响
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
# define mod 1000000007
ll fac[1000000+10],inv[1000000+10];
ll qp(ll base, ll pow)
{
ll ans=1;
while(pow)
{
if(pow&1)
ans=ans*base%mod;
pow>>=1;
base=base*base%mod;
}
return ans;
}
void init()
{
fac[0]=1;
for(int i=1;i<=1000000;i++)
{
fac[i]=fac[i-1]*(ll)i%mod;
}
inv[1000000]=qp(fac[1000000],mod-2);
for(int i=1000000-1;i>=0;i--)
{
inv[i]=(ll)(i+1)*inv[i+1]%mod;
}
}
ll getc(int x,int y)
{
if(x<y)
return 0;
return fac[x]*inv[y]%mod*inv[x-y]%mod;
}
int l[200000+10],r[200000+10];
int main()
{
init();
string s;
cin>>s;
s=" "+s;
for(int i=1;i<s.length();i++)
{
l[i]+=l[i-1];
l[i]+=(s[i]=='(');
}
for(int i=s.length()-1;i>=1;i--)
{
r[i]+=r[i+1];
r[i]+=(s[i]==')');
}
ll ans=0;
for(int i=2;i<s.length();i++)
{
if(s[i]==')')
{
ans+=getc(r[i]+l[i]-1,r[i]);
ans%=mod;
}
}
cout<<ans;
return 0;
}