BZOJ 4001 TJOI 2015 概率论 卡特兰数 生成函数计数

求随机有根二叉树的叶节点数的期望。

fi 表示有 i 个节点的二叉树的个数,显然 f0=1 ,且有递归定义

fi=i=0i1fifni1

gk=ki=0fifki
那么数列 g 的生成函数即 G(x)=F2(x)
fi=gi1 ,即 F(x)=xG(x)+1

F(x)=xF2(x)+1

解得
F(x)=114x2x

(丢掉的一根是为了函数收敛)

由于答案是 xn 项的系数。。
所以二项式定理展开有

F(x)=1(14x)122x=1i=0(12i)(4x)i2x=1i=0(12i)(4)ixi2x=1+i=012i1(2ii)xi2x=i=112i1(2ii)xi12=i=012i+1(2i+2i+1)xi2=i=014i+2(2i+2i+1)xi=i=014i+2(2i+1)(2i+2)(i+1)(i+1)(2ii)xi=i=01i+1(2ii)xi

因此有 fi=1i+1(2ii)

节点数为 n 的所有二叉树的叶子种数为 hn
考虑左子树对答案的贡献是 hifni1 ,右子树对称。
因此

hn=2i=0n1hifni1

初始值 h1=1
H(x)=2H(x)xF(x)+x

解得
H(x)=x14x

类似 fi 的推导可知
hi=(2i2i1)

因此本题期望即
hifi=n(n+1)2(2n1)

#include 
main(){double x;scanf("%lf",&x);printf("%.9lf",x*(x+1)/2/(2*x-1));}

听说你们压代码。。

var x:real;begin read(x);x:=x*(x+1)/2/(2*x-1);writeln(x:0:9);end.

好久没写pascal
强行手写不编译一下。
好像还要短一些。。。

至于节点数为n的二叉树的数量,可以理解为出入栈问题。
入栈往下一层走,出栈往上一层走。

你可能感兴趣的:(BZOJ,省选,概率期望,计数问题)