P3978 [TJOI2015]概率论
$rqy$ 的题解好神啊....
设 $f_n$ 表示 $n$ 个点的二叉树个数,$g_n$ 表示所有 $f_n$ 颗二叉树的叶子节点总数
那么答案就是 $g_n/f_n$,首先 $f_n$ 显然就是 $Catalan$ 数列
打表可以发现 $g_n=nf_{n-1}$,证明很神
因为一个 $n$ 个节点的二叉树,假设有 $k$ 个叶子,那么依次删除这 $k$ 个叶子就会得到 $k$ 个 $n-1$ 个节点的二叉树
而 $g_n$ 其实就是所有 $n$ 个节点的二叉树,删除叶子的次数和,也等于删除后出现的二叉树数量(可以相同)
对于一个 $n-1$ 个节点的二叉树,显然它一定有且只有 $n$ 位置可以挂叶子,那么从 $n$ 个节点删成 $n-1$ 个节点时这颗树就会出现 $n$ 次
所以得到 $g_n=nf_{n-1}$
然后化一波式子就可以得到答案了
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; typedef long long ll; typedef long double ldb; inline int read() { int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*f; } ldb n; int main() { n=read(); printf("%.12Lf\n",n*(n+1)/(2*(2*n-1))); return 0; }