LG P3978 [TJOI2015]概率论

Posted anverking

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LG P3978 [TJOI2015]概率论相关的知识,希望对你有一定的参考价值。

题意描述

为了提高智商,ZJY开始学习概率论.有一天,她想到了这样一个问题:对于一棵随机生成的\(n\)个结点的有根二叉树(所有互相不同构的形态等概率出现),它的叶子节点数的期望是多少呢?
判断两棵树是否同构的伪代码如下:

\(\textCHECK(T1,T2):\)
\(//\text两棵树的节点T1,T2\)
\(\mathbfif\ T1=\mathbfNULL\ \mathbfor\ T2=\mathbfNULL:\)
\(\quad \mathbfreturn\ T1=\mathbfNULL\ \mathbfand\ T2=\mathbfNULL\)
\(\mathbfelse:\)
\(\mathbfreturn\ \textCHECK(T1.leftson,T2.leftson)\ \mathbfand\ \textCHECK(T1.rightson,T2.rightson)\)

分析

首先,我们令\(f_n\)表示\(n\)个点的二叉树个数;\(g_n\)表示\(n\)个点的所有\(f_n\)棵二叉树的叶节点总数.

找规律第一步当然是打表啦~写个爆搜或者手算都可以.

n 1 2 3 4 5 ...
\(f_n\) 1 2 5 14 42 ...
\(g_n\) 1 2 6 20 70 ...

我们发现一个规律:\(g_n\)=\(nf_n-1\).

证明这个规律其实超级简单:

  • 对于每棵\(n\)个点的二叉树,如果里面有\(k\)个叶节点,那么我们分别把这\(k\)个叶子删去会得到\(k\)\(n-1\)个点的二叉树;
  • 而每棵\(n-1\)个点的二叉树恰好有\(n\)个位置可以悬挂一个新的叶子,所以每棵\(n-1\)个点的二叉树被得到了\(n\)次;
  • 综上,我们即可得出结论:所有\(n\)个点的二叉树的叶子个数和等于\(n-1\)个点的二叉树个数\(\times n\).

那么我们只需要求出\(f\)即可.而\(f\)的递推式可以通过枚举左子树结点个数得到:
\[ f_n=\sum_i=1^n-1f_if_n-i-1 \]
边界是\(f_1=1\).应该可以一眼看出来这是Catalan数列(其实一看那个\(1,2,5,14,421,2,5,14,42\)就应该知道)

于是答案即为
\[ \fracg_nf_n=\fracnf_n-1f_n \]
代入卡特兰数的通项公式
\[ f_n=\frac\binom2nnn+1 \]
很容易就得到上式等于
\[ \fracn(n+1)2(2n-1). \]

Code

double n;

int main()

    scanf("%lf",&n);
    printf("%.12lf\n",n*(n+1)/(2*(2*n-1)));

以上是关于LG P3978 [TJOI2015]概率论的主要内容,如果未能解决你的问题,请参考以下文章

luogu P3978 [TJOI2015]概率论

并不对劲的bzoj4001:loj2105:p3978:[TJOI2015]概率论

bzoj4001: [TJOI2015]概率论

[TJOI2015]概率论

bzoj4001 [TJOI2015]概率论

BZOJ 4001 [TJOI2015]概率论 ——找规律