Problem
【TJOI2015】概率论
TimeLimit:10Sec
MemoryLimit:128MB
Description
输入一个正整数N,代表有根树的节点数。
Output
输出这棵树期望的叶子节点数。要求误差小于10−9。
Sample Output
Hint
1≤N≤109
标签:生成函数
Solution
生成函数结论题。
1. 构造递推式
考虑用fi表示i个结点的树的所有形态中叶子结点的个数和,用gi表示i个结点的树的所有形态数。则叶子个数的期望为gifi。
首先计算gi。对于i个结点的二叉树,去掉根后还剩i−1个结点,若左子树中有j个结点,则右子树中有i−j−1个结点,可知左子树有gj种形态,右子树有gi−j−1种形态,因此此种情况下树的形态数为gj×gi−j−1。故有gi=∑j=0i−1gjgi−j−1。
然后计算fi。对于i个结点的二叉树,若左子树中有j个结点,右子树中有i−j−1个结点,可知叶子结点个数和会增加fj×gi−j−1。于是有fi=∑j=0i−1fjgi−j−1。
2. 构造生成函数
补充定义f0=1,g0=1构造f,g的生成函数:
F(x)=f0x0+f1x1+⋯+fixi+⋯G(x)=g0x0+g1x1+⋯+gixi+⋯
对于G(x),有G2(x)=g02x0+(g0g1+g1g0)x1+⋯+∑j=0igjgi−jxi+⋯,于是G(x)=G2(x)+1。同理,对于F(x),将F(x)G(x)展开后与F(x)比较,可得F(x)=2xF(x)G(x)+1。
由此,解二次方程
{F(x)=2xF(x)G(x)+1G(x)=G2(x)+1
可得
{F(x)=1−4xxG(x)=2x1−1−4x
(已根据带入x=1后得出结果的正负性舍去每个函数的另一种取值。)
3. 解递推式通项
接下来用广义二项式定理展开1−4x并求出f,g的通项。
定义广义下的二项式系数(kα)(α∈R,k∈Z∗)为
(kα)=k!α(α−1)(α−2)⋯(α−k+1)
有定理
(x+y)α=i=0∑∞(iα)xα−iyi
则有特殊形式
1+x=(1+x)21=i=0∑∞(i21)xi1+x1=(1+x)−21=i=0∑∞(i−21)xi
因此
F(x)=xi=0∑∞(i−21)(−4)ixiG(x)=2x1−∑i=0∞(i21)(−4)ixi
分别化简两个函数中带广义二项式系数的系数
(i−21)(−4)i(i21)(−4)i=i!−21(−21−1)(−21−2)⋯(−21−i+1)(−4)i=i!−1(−1−2)(−1−4)⋯(−1−2i+2)(−2)i=(−1)ii!−1(−1−2)(−1−4)⋯(−1−2i+2)2i=i!1×3×5×⋯×(2i−1)×i!2×4×6×⋯×2i=i!i!(2i)!=(i2i)=i!21(21−1)(21−2)⋯(21−i+1)(−4)i=i!1(1−2)(1−4)⋯(1−2i+2)(−2)i=(−1)ii!(1−2)(1−4)⋯(1−2i+2)×2i=−i!1×3×5×⋯×(2i−3)×i!2×4×6×⋯×2i=−(2i−1)i!i!(2i)!=−2i−11(i2i)
分别带回原生成函数得
F(x)G(x)=xi=0∑∞(i−21)(−4)ixi=xi=0∑∞(i2i)xi=i=1∑∞(i−12i−2)xi=i=1∑∞2i(2i−1)i2(i2i)xi=i=1∑∞2(2i−1)i(i2i)xi=2x1−∑i=0∞(i21)(−4)ixi=2x1+∑i=0∞2i−11(i2i)xi=2∑i=1∞2i−11(i2i)xi−1=i=0∑∞2(2i+1)1(i+12i+2)xi=i=0∑∞2(2i+1)1⋅(i+1)2(2i+1)(2i+2)(i2i)xi=i=0∑∞i+11(i2i)xi
因此有通项
{fi=2(2i−1)i(i2i)gi=i+11(i2i)
综上,可得答案Ans=hnfn=4n−2n(n+1)。
Code
1 2 3 4 5 6 7
| #include <bits/stdc++.h> using namespace std; int main() { double n; scanf("%lf", &n); printf("%.9lf\n", n*(n+1)/(4*n-2)); return 0; }
|