TJOI 2015 概率论 题解
TJOI 2015 概率论 题解
题意
求 个点随机生成的有根二叉树(所有互不同构的二叉树出现情况等概率)的叶子节点数的期望值。
题解
70
答案显然是 , 是 个点为所有二叉树的叶子总数, 是 个点能生成的二叉树数。
一棵树可以用左右儿子与根节点拼接而成。
显然
同理 也可以用 转移,需要高精度。
当然考试后我懒得写用 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
我们要观察 :这其实就是卡特兰数的递推式。即 是卡特兰数第 项。
先补一课:卡特兰数的封闭形式。
对于卡特兰数 ,且 ,设其生成函数
的递推式很像卷积,可以将 卷起来:
发现 的次数与我们想要的形式差了 1 ,变化一下。
就相差 项,所以 ,解得
如何取舍?分子有理化: ,带入 ,得到常数项。
发现符号时加号时满足 ;但减号时分母为 0 ,舍去
所以
2
同理,我们来处理叶子个数 ,
设 的生成函数为 ,则
解得
根据牛顿二项式定理,
连乘不连续,考虑化成连续。
这样上下都连续了。
得到封闭形式。求 就是 项的系数。
带入卡特兰数通项公式
所以化简可得
#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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步