1. 程式人生 > 實用技巧 >[TJOI2015] 概率論 - 組合數學

[TJOI2015] 概率論 - 組合數學

Description

\(n \le 10^9\) 個節點的二叉樹的葉子節點數期望。

Solution

\(f_i\) 表示 \(i\) 階二叉樹本質不同個數,\(g_i\) 表示所有本質不同 \(i\) 階二叉樹的樹葉個數的和,則有

\[f_i = \sum_{j=0}^{i-1} f_jf_{i-j-1}, \quad g_i=2\sum_{j=0}^{i-1} f_j g_{i-j-1} \]

顯然 \(f_i\) 是卡特蘭數數列,有

\[f_n=\frac {C_{2n}^n} {n+1} =\frac {4n-2} {n+1} f_{n-1} \]

然而 \(g_i\) 不好處理,下面我們證明 \(g_n=nf_{n-1}\)

對於 \(n\) 階二叉樹,設有 \(k\) 個葉子,分別刪去得到 \(k\)\(n-1\) 階二叉樹。而每個 \(n-1\) 階二叉樹有 \(n\) 個位置可以懸掛新的葉子,這種新增方式唯一對應了一種刪除操作,而刪除操作的總數就是所有葉子的個數總和。因此,葉子個數的總和為 \(nf_{n-1}\)

於是有

\[\frac {g_n} {f_n} = \frac {nf_{n-1}} {f_n} =\frac {n(n+1)}{4n-2} \]

#include <bits/stdc++.h>
using namespace std;

signed main()
{
    double n;
    cin>>n;
    printf("%.10lf",n*(n+1)/(4*n-2));
}