P3978 [TJOI2015] 概率论

从符号化方法入手就很快。

定义组合类 \((T,|\cdot|)\),为所有二叉树的组合类,\(|\cdot|\) 将组合类元素映射为二元组 \((a,b)\)\(a\) 表示二叉树大小,\(b\) 表示叶子节点数。

其对应生成函数为 \(T(x,y) = \sum t_{a,b}x^ay^b\)

显然有:

\[\begin{matrix} T = \alpha + T * \beta + \beta * T + T * \beta * T \\ |\alpha| = (1,1) \\ |\beta| = (1,0) \end{matrix} \]

容易得出生成函数:

\[T = x(y+2T+T^2) \Rightarrow x = \frac{T}{y+2T+T^2} \]

大力拉反:

\[[x^n]T = \frac{1}{n}[u^{n-1}](y+2u+u^2)^n \]

因为叶子期望 \(E\) 等于叶子总数除二叉树总数。

叶子总数:

\[\frac{d}{dy}[x^n]T|_{y=1} = [u^{n-1}](u^2+2u+1)^{n-1} = [u^{n-1}](u+1)^{2n-2} = \begin{pmatrix}2n-2 \\ n-1\end{pmatrix} \]

二叉树总数即为卡特兰数。

得到答案:\(\frac{n(n+1)}{2(2n-1)}\)

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
double ans;
signed main()
{
    scanf("%lld",&n);
    ans = (1.0 * n * (n + 1)) / 2 / (2 * n - 1);
    printf("%.10lf",ans);
}
posted @ 2024-02-04 22:48  Aysct  阅读(47)  评论(0)    收藏  举报