[BZOJ4001] 概率论(生成函数)

Problem

求一个含有 n n n个节点的二叉树的叶子节点的期望个数。

Data constraint

n ≤ 1 0 9 n\le 10^9 n109

Solution

考虑 h ( n ) h(n) h(n)表示有 n n n个节点的二叉树个数, f ( n ) f(n) f(n)表示 n n n个节点的二叉树叶子节点个数和,那么所求即为 h ( x ) f ( x ) \frac{h(x)}{f(x)} f(x)h(x)

然后考虑这两个的生成函数,分别设为 H ( x ) , F ( x ) H(x),F(x) H(x),F(x).

枚举左子树大小 i i i,然后 f f f是根据左右子树叶子节点对称,所以有 H n = ∑ i = 0 n − 1 H i ⋅ H n − i − 1 H_n = \sum_{i=0}^{n-1}H_i \cdot H_{n-i-1} Hn=i=0n1HiHni1 f n = 2 ∑ i = 0 n − 1 f i ⋅ H n − i − 1 f_n = 2\sum_{i=0}^{n-1} f_i \cdot H_{n-i-1} fn=2i=0n1fiHni1

那么可以得出 H ( x ) = x H 2 ( x ) + 1 H(x)=xH^2(x)+1 H(x)=xH2(x)+1 F ( x ) = 2 x H ( x ) + x F(x)=2xH(x)+x F(x)=2xH(x)+x

解方程得到:
H ( x ) = 1 ± 1 − 4 x 2 x H(x) = \frac{1 \pm \sqrt{1-4x}}{2x} H(x)=2x1±14x

然后对解求极限,发现因为 H ( 0 ) = 1 H(0)=1 H(0)=1,且

lim ⁡ x → 0 + 1 + 1 − 4 x 2 x = + ∞ \lim_{x \rightarrow 0^+} \frac{1 + \sqrt{1 - 4x}}{2x} = +\infty x0+lim2x1+14x =+ lim ⁡ x → 0 + 1 − 1 − 4 x 2 x = 1 \lim_{x \rightarrow 0^+} \frac{1 - \sqrt{1 - 4x}}{2x} = 1 x0+lim2x114x =1

所以解是 H ( x ) = 1 − 1 − 4 x 2 x H(x)=\frac{1 - \sqrt{1-4x}}{2x} H(x)=2x114x ,然后可以得出 F ( x ) = x 1 − 4 x F(x)=\frac{x}{\sqrt{1-4x}} F(x)=14x x.

然后根据广义二项式定理展开 1 − 4 x \sqrt{1-4x} 14x ,可以得到 1 − 4 x = ( 1 − 4 x ) 1 2 = ∑ i = 0 ∞ ( 1 2 i ) ( − 4 x ) i \sqrt{1-4x} = \left (1-4x \right )^{\frac{1}{2}} = \sum_{i=0}^{\infty}{\frac{1}{2} \choose i}(-4x)^i 14x =(14x)21=i=0(i21)(4x)i

考虑第 n n n项系数,那么有: ( − 4 ) n ( 1 2 n ) = ( − 4 ) n 1 2 ⋅ ( 1 2 − 1 ) ⋅ ( 1 2 − 2 ) ⋯ ( 1 2 − n + 1 ) 1 ⋅ 2 ⋅ 3 ⋯ n (-4)^n { \frac{1}{2} \choose n } = (-4)^n \frac{\frac{1}{2}\cdot \left( \frac{1}{2} -1 \right)\cdot \left( \frac{1}{2} -2 \right)\cdots \left( \frac{1}{2} - n + 1 \right)}{1\cdot2\cdot3\cdots n} (4)n(n21)=(4)n123n21(211)(212)(21n+1)
化简得到 − 1 2 n − 1 ( 2 n n ) -\frac{1}{2n-1}{{2n} \choose n} 2n11(n2n)

于是带入 H ( x ) H(x) H(x)可以得到, H ( x ) = 1 − 1 − 4 x 2 x = 1 + ∑ i = 0 ∞ 1 2 i − 1 ( 2 i i ) x i 2 x = ∑ i = 1 ∞ 1 2 i − 1 ( 2 i i ) x i − 1 2 H(x) = \frac{1-\sqrt{1-4x}}{2x} =\frac{1+\sum_{i=0}^{\infty}\frac{1}{2i-1}{{2i} \choose i} x^i}{2x} =\frac{\sum_{i=1}^{\infty}\frac{1}{2i-1}{{2i} \choose i} x^{i-1}}{2} H(x)=2x114x =2x1+i=02i11(i2i)xi=2i=12i11(i2i)xi1
化简可以得到 H ( x ) = ∑ i = 0 ∞ 1 n + 1 ( 2 i i ) x i H(x)=\sum_{i=0}^{\infty}\frac{1}{n+1}{{2i} \choose i} x^i H(x)=i=0n+11(i2i)xi

于是我们得到Catalan数第 n n n项为 1 n + 1 ( 2 n n ) \frac{1}{n+1}\binom{2n}{n} n+11(n2n)

回到原问题,类似的,我们考虑把 F ( x ) F(x) F(x)用广义二项式定理展开,可以得到 F ( x ) = x ∑ i = 0 ∞ ( − 1 2 i ) ( − 4 x ) i F(x)=x\sum_{i=0}^{\infty}\binom{-\frac{1}{2}}{i}(-4x)^i F(x)=xi=0(i21)(4x)i

与上面类似,最终可以得到 f n = ( 2 n − 2 n − 1 ) f_n=\binom{2n-2}{n-1} fn=(n12n2)

于是所求为 h ( x ) f ( x ) = n ( n + 1 ) 2 ( 2 n − 1 ) \frac{h(x)}{f(x)}=\frac{n(n+1)}{2(2n-1)} f(x)h(x)=2(2n1)n(n+1).

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BZOJ 2908 题目是一个数据下载任务。这个任务要求下载指定的数据文件,并统计文件中小于等于给定整数的数字个数。 为了完成这个任务,首先需要选择一个合适的网址来下载文件。我们可以使用一个网络爬虫库,如Python中的Requests库,来帮助我们完成文件下载的操作。 首先,我们需要使用Requests库中的get()方法来访问目标网址,并将目标文件下载到我们的本地计算机中。可以使用以下代码实现文件下载: ```python import requests url = '目标文件的网址' response = requests.get(url) with open('本地保存文件的路径', 'wb') as file: file.write(response.content) ``` 下载完成后,我们可以使用Python内置的open()函数打开已下载的文件,并按行读取文件内容。可以使用以下代码实现文件内容读取: ```python count = 0 with open('本地保存文件的路径', 'r') as file: for line in file: # 在这里实现对每一行数据的判断 # 如果小于等于给定整数,count 加 1 # 否则,不进行任何操作 ``` 在每一行的处理过程中,我们可以使用split()方法将一行数据分割成多个字符串,并使用int()函数将其转换为整数。然后,我们可以将该整数与给定整数进行比较,以判断是否小于等于给定整数。 最后,我们可以将统计结果打印出来,以满足题目的要求。 综上所述,以上是关于解决 BZOJ 2908 数据下载任务的简要步骤和代码实现。 希望对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值