Processing math: 100%

BZOJ 4001 概率论 解题报告


4001: [TJOI2015]概率论
Time Limit: 10 Sec  Memory Limit: 128 MB
Description
为了提高智商,ZJY开始学习概率论。有一天,她想到了这样一个问题:对于一颗随机生成的n个节点的有根二叉树(所以互相不同构的形态等概率出现),它的叶子节点数的期望是多少呢?
      
判断两棵树是否同构的伪代码如下:
算法1bool Check(T1, T2)
         Require
:两棵树的节点T1, T2
                  if T1==null || T2==null then
                          return T1==null && T2==null
                  else
                          return Check(T1->leftson, T2->leftson) && Check(T1->rightson, T2->rightson)
                  end if
Input
输入一个正整数N,代表有根树的结点数
Output
 输出这棵树期望的叶子节点数。要求误差小于1×109
Sample Input
1
Sample Output
1.000000000
HINT
1N109
Solution
P(x)表示x个节点的二叉树叶子节点数的期望,fxx个节点可构成的不同二叉树的数量,sxx个节点构成的所有不同二叉树的叶子节点的和。由期望的定义可得,P(x)=sxfx
fx的求法是一个经典的卡塔兰数问题:固定某个点为根节点,设其左子树有a个节点,右子树有b个节点,在此条件下,不同的二叉树的数量等于fafb。而对于fxa+b=x10ax1。即:fx=x1i=0fifx1i
显然fx是第x个卡塔兰数(参见https://en.wikipedia.org/wiki/Catalan_number)。于是,fx=1x+1(2xx)
我们用相似的方式推导sx的递推式:
固定某个点为根节点,设其左子树有a个节点,右子树有b个节点,我们首先这考虑左子树对sx的贡献,所有不同的左子树的叶子节点的数量和为sa,每种方案都可以和一个右子树结合得到一棵不同形态的二叉树,结合的方案数为fb,所以左子树对sx的贡献为safb。类似地,左右子树的总贡献为safb+fasb。又因为a+b=x,所以:sx=x1i=0(sifx1i+fisx1i)=2x1i=0sifx1i
参考卡塔兰数通项公式的推导,我们采用母函数计算sx的通项公式。

我们首先确定s0的值,由于s1=2f0s0=1s2=2s0f1+2s1f0=2,我们发现s0无论取和值都无法满足条件。于是我们大胆猜测,sx的递推式不适用于第一项。这样,s0=0
根据普通母函数的定义,设:g(x)=n=0snxn
h(x)=n=0fnxn
展开,有g(x)=s0+s1x+s2x2+s3x3+...
h(x)=f0+f1x+f2x2+f3x3+...
考虑母函数与递推式的联系:g(x)h(x)=s0f0+(s0f1+s1f0)x+(s2f0+s1f1+s0f2)x2+...
整理,得:g(x)h(x)=0i=0sif0i+(1i=0sif1i)x+(2i=0sif2i)x2+...
根据sx的递推式:xg(x)h(x)=0i=0sif0ix+(1i=0sif1i)x2+(2i=0sif2i)x3+...
2xg(x)h(x)=0+s2x2+s3x3+...
即:2xg(x)h(x)=g(x)s1x
结合卡塔兰数的推导:{2xg(x)h(x)=g(x)xxh(x)2=h(x)1
解得:{g(x)=x14xh(x)=114x2x,{g(x)=x14xh(x)=1+14x2x
不妨令g(x)=x14x=x(14x)12,根据二项式定理:g(x)=xn=0(12n)(4x)n
g(x)=xn=0(12)×(32)×...×(12i+1)n!(4x)n
g(x)=xn=01×3×...×(2n1)n!2nxn
g(x)=xn=0(2n)!n!n!xn
g(x)=xn=0(2nn)xn
g(x)=n=1(2n2n1)xn
所以sx=(2x+2x+1)
     得到了sx的通项公式。我们可以一眼看出P(x)=x2+x4x2
       代码一分钟,公式一下午!
:(

1 条评论: