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);
}

浙公网安备 33010602011771号