TJOI 2015 概率论 题解

TJOI 2015 概率论 题解

题意

n 个点随机生成的有根二叉树(所有互不同构的二叉树出现情况等概率)的叶子节点数的期望值。

题解

70

答案显然是 g(n)f(n)g(n)n 个点为所有二叉树的叶子总数, f(n)n 个点能生成的二叉树数。

一棵树可以用左右儿子与根节点拼接而成。

显然 fi=j=0i1fjfij1

同理 g 也可以用 f 转移,需要高精度。

当然考试后我懒得写用 py 验证了一下正确性。

n = int(input())
f = []
g = []
for i in range(0, 101):
    f.append(0)
    g.append(0)

f[0] = f[1] = g[1] = 1

for i in range(2, n + 1):
    for j in range(0, i):
        f[i] += f[j] * f[i - j - 1]
        g[i] += g[j] * f[i - j -  1] + f[j] * g[i - j - 1]

ans = 1.0 * g[n] / f[n]
print('%.9f' % ans)

100

前置知识:生成函数,卡特兰数,牛顿二项式定理。

1

我们要观察 f :这其实就是卡特兰数的递推式。即 f(n) 是卡特兰数第 n 项。

先补一课:卡特兰数的封闭形式。

对于卡特兰数 fi=j=0i1fjfij1 ,且 f0=f1=1 ,设其生成函数 F(x)=i0fixi

f 的递推式很像卷积,可以将 F 卷起来:

F2(x)=i0xij=0ifjfij

发现 x 的次数与我们想要的形式差了 1 ,变化一下。

xF2(x)=i1xij=0i1fjfij1=i1fixi

就相差 i=0 项,所以 xF2(x)+1=F(x) ,解得 F(x)=1±14x2x

如何取舍?分子有理化: F(x)=2114x ,带入 x=0 ,得到常数项。

发现符号时加号时满足 f0=F(0)=1 ;但减号时分母为 0 ,舍去

所以 F(x)=114x2x

2

同理,我们来处理叶子个数 g

gi=[i=1]+j=0i1fjgij1+gjfij1

g 的生成函数为 G ,则 G(x)=2xF(x)G(x)+x1

解得 G(x)=x12xF(x)=x14x

根据牛顿二项式定理,

G(x)=x(14x)12=xi0(12i)(4x)i=xi0(4)ixi(12)i_i!=xi0xij=1i(2j1)2×j×(4)

连乘不连续,考虑化成连续。

=xi0xij=1i(2j1)(2j)(2j)(2j)×4

这样上下都连续了。

G(x)=xi0xi(2i)!(i!)2

得到封闭形式。求 gn 就是 xn 项的系数。

gn=(2n2)!(n1)!2

带入卡特兰数通项公式

fn=(2nn)(2nn1)=(2n)!n!n!(2n)!(n+1)!(n1)!=(2n)!n!n!(1nn+1)=(2n)!n!(n+1)!

所以化简可得 ans=gnfn=n(n+1)2(2n1)

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL n;
int main() {
	freopen("prob.in", "r", stdin);
	freopen("prob.out", "w", stdout);
	scanf("%lld",&n);
	printf("%.9f", 1.0 * n * (n + 1) / (2.0 * (2.0 * n - 1)));
}

本文作者:小蒟蒻laf

本文链接:https://www.cnblogs.com/KonjakLAF/p/17323211.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   小蒟蒻laf  阅读(24)  评论(1编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起