1. 程式人生 > >【BZOJ4001】[TJOI2015] 概率論(卡特蘭數)

【BZOJ4001】[TJOI2015] 概率論(卡特蘭數)

點此看題面

大致題意: 問你一棵\(n\)個節點的有根二叉樹葉節點的期望個數。


大致思路

看到期望,比較顯然可以想到設\(num_i\)\(i\)個節點的二叉樹個數,\(tot_i\)為所有\(i\)個節點的二叉樹的葉節點總數。

則答案顯然為\(\frac{tot_i}{num_i}\)

\(num_i\)其實就是一個卡特蘭數(這其實就是\(NOIP2018\)提高組初賽卷中\(T8\)\(A\)選項改正後的結果啊),故可以得到\(num_i=(2n)!/(n+1)!/n!\)

通過找規律可以發現\(tot_i=n\cdot num_{i-1}\)

於是答案就是\(\frac{n\cdot num_{i-1}}{num_i}=\frac{n\cdot(2n-2)!/n!/(n-1)!}{(2n)!/(n+1)!/n!}=\frac{n}{2n(2n-1)/(n+1)/n}=\frac{n(n+1)}{4n-2}\)

程式碼也十分簡潔。


程式碼

#include<bits/stdc++.h>
using namespace std;
int n;
int main()
{
    scanf("%d",&n),printf("%.9lf",1.0*n*(n+1)/(4LL*n-2));//求出n(n+1)/(4n-2)
    return 0;
}