BZOJ4001:[TJOI2015]概率论(卡特兰数,概率期望)

Description

Input

输入一个正整数N,代表有根树的结点数

Output

 输出这棵树期望的叶子节点数。要求误差小于1e-9

Sample Input

1

Sample Output

1.000000000

HINT

 1<=N<=10^9

Solution

好神仙一个题啊……
rqy大爷的证明真的超简单明了QwQ膜拜rqy
首先设$f_n$表示$n$个点的二叉树个数,$g_n$表示$n$个点所有$f_n$棵二叉树的叶节点总数
打个表可以发现:
$f:1 ~2~ 5~ 14 ~42$
$g:1~ 2 ~6 ~20 ~70$
可以发现$g_n=n*f_{n-1}$
怎么证明呢?
1、对于每颗$n$个点的二叉树,如果里面有$k$个叶节点,我们依次删除$k$个叶子会得到$k$个$n-1$的二叉树
2、我画了个图才发现对于每颗$n-1$个点的二叉树有$n$个位置可以悬挂一个新的叶子,所以每个$n-1$个点的二叉树被得到了$n$次
证完了
$f$的递推式可以通过枚举左子树节点个数得到:
$f_n=\sum_{i=1}^{n-1}f_{i}*f_{n-i-1}$
(rqy大爷)很容易发现这是个卡特兰数
答案为$\frac{g_n}{f_n} = \frac{n*f_{n-1}}{f_n}$
代入卡特兰数通项公式可以得到答案为$\frac{n*(n+1)}{2*(2*n-1)}$

Code

1 #include<cstdio>
2 int main()
3 {
4     double n;
5     scanf("%lf",&n);
6     printf("%.9lf",n*(n+1)/(2*(2*n-1)));
7 }
posted @ 2018-07-15 10:52  Refun  阅读(265)  评论(0编辑  收藏  举报