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 }
View Code

 

posted @ 2020-05-11 15:49  古比  阅读(120)  评论(0编辑  收藏  举报