E 弦 卡特兰数
https://ac.nowcoder.com/acm/contest/5477/E
答案是 2^n / (n + 1)!。概率可以通过合法方案数/总方案数来计算。
合法方案数 f(n)=Σf(i) * f(n-i-1), 即为卡特兰数,
故 f(n)=C(2n, n) / (n + 1)。
总方案数为 C(2n, 2) * C(2n – 2, 2) … C(2, 2) / n! = (2n)! / n! / 2^n。
两者相除即为答案。除法取模的话用逆元来计算(即费马小定理)。 总复杂度O(n)。
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const ll N=1e5+5,mod=1e9+7; 5 ll ksm(ll a,ll n){ 6 ll ans=1; 7 while(n){ 8 if(n&1) ans=ans*a%mod; 9 a=a*a%mod; 10 n>>=1; 11 } 12 return ans; 13 } 14 int main() 15 { 16 int n; 17 scanf("%d",&n); 18 ll b=1,a=ksm(2,n); 19 for(int i=1;i<=n+1;i++) 20 b=b*i%mod; 21 printf("%lld\n",a*ksm(b,mod-2)%mod); 22 return 0; 23 }