1 条题解
-
0
P3978 [TJOI2015]概率论 题解
题目大意:求 个点的有根二叉树的叶子结点的期望数。
0 前言(心路历程)
可以跳过一看题目,输入一个数,输出一个数,打表题!!!
(喜得 30 分!!!)之后将表中的小数化成分数,发现分母是卡特兰数,第 个分子等于第 个分母的 倍,之后退出来一个式子
(AC紫题!!!)1 正文
如果用 表示 个结点的不同有根二叉树的个数,用 表示 个点的所有二叉树的叶子结点的和,那么答案
显然就是 。2 求 。
显然。当 时,添加了一个点,这个点可以
-
在 的左子树中,有 种方案;
-
在 的右子树中,有 种方案;
所以 。
当 时,添加了两个点,这两个点可以
-
在 的左子树中,有 种方案;
-
一个在 的左子树中,一个在 的右子树中,有 种方案;
-
在 的右子树中,有 种方案;
所以 。
当 时,添加了三个点,这三个点可以
-
在 的左子树中,有 种方案;
-
两个在 的左子树中,一个在 的右子树中,有 种方案;
-
一个在 的左子树中,两个在 的右子树中,有 种方案;
-
在 的右子树中,有 种方案;
所以 。
如果设 ,那么上面是个式子可以变成:
。
。
。
$a_4=a_0\times a_3+a_2\times a_1+a_1\times a_2+a_3\times a_0$ 。
那么 $a_n=a_0\times a_{n-1}+a_1\times a_{n-2}+……+a_{n-1}\times a_0$ 。
这个数列就是经典的卡特兰数,通项公式为 。
3 求
part 1
一个 个结点的数有 条边,结点度数的和为 。
添加一个叶子之后原来 个结点的度数和会加一。
而这 个结点,根结点度数最大为 ,其他结点的度数最大为 (一个父结点两个儿子结点),所以这 个结点度数和最大为 。
度数和最大为 ,当前度数为 ,添加一个叶子度数加一,那么一个 个结点的二叉树可以添加 个叶子。
而 个结点的二叉树有 个,每个二叉树可以添加 个叶子,所以总共可以添加 个叶子。
part 2
一个有 个结点的二叉树,每删去一个叶子结点,就产生了一个 个结点的二叉树,而因为 个结点的二叉树总共有 个结点,所以可以产生 个 个结点的二叉树。
part 1+2
会发现,将 个结点的二叉树增加一个叶子形成 个结点的二叉树,与将 个结点的二叉树删去一个叶子形成一个 个结点的二叉树是互逆(
我语文不太好,反正是这个意思)的,所以 part 1 和 part 2 是互逆的,这样就得到了 。4 求解
这样,我们得到了 和 ,开始求解。
$$\frac{b_n}{a_n}=\frac{a_{n-1}\times n}{a_n}=\frac{\frac{\left(2n-2\right)!}{n!\left(n-1\right)!}\times n}{\frac{\left(2n\right)!}{n!\left(n+1\right)!}}=\frac{\frac{\left(2n-2\right)!}{\left(n-1\right)!}\times n}{\frac{\left(2n\right)!}{\left(n+1\right)!}}=\frac{\left(2n-2\right)!\left(n+1\right)!n}{\left(2n\right)!\left(n-1\right)!}=\frac{n^2\left(n+1\right)}{2n\times \left(2n-1\right)}=\frac{n\left(n+1\right)}{2\left(2n-1\right)}$$5 代码
注意 :题目要求误差不超过 ,所以为了正确性,尽量输出至少九位小数。
注意 :整数除整数结果是整数,所以 开 double 或乘上 。
注意 :虽然 是 int 范围内的,但是计算分母时会超出 int 范围,所以 开 long long 或乘上 1ll 或 2ll
代码:
#include<cstdio> #include<iostream> int main() { register int n; scanf("%d",&n); printf("%.9lf",1.0*n*(n+1)/(2ll*(2*n-1))); return 0; } -
- 1
信息
- ID
- 5666
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者