[TJOI2015] 概率论

[TJOI2015] 概率论

我们设 \(f[n]\) 表示有 \(n\) 个节点的不同形态的二叉树的数量, \(g[n]\) 表示有 \(n\) 个节点的不同形态的二叉树的叶子节点的总和.

显然, \(f\) 是卡特兰数.

接下来让我们看一个结论:

\(g[i] = f[i - 1] * n\)

为什么呢?

  • 考虑一个有 \(n\) 个节点 \(k\) 个叶子的二叉树, 我们删除任意一个叶子, 都是一棵二叉树, 并且分别删除 \(k\) 个点之后是 \(k\) 个不同的二叉树, 也就是每个叶子唯一对应一棵 \(n - 1\) 个节点的二叉树.
  • 考虑一个有 \(n - 1\) 个节点的二叉树, 那它有 \(n\) 个位置可以放叶子, 所以每棵二叉树就被得到了 \(n\) 次.
  • 综上, 我们可以得出结论, 所有 \(n\) 个点的二叉树的叶子总数等于 \(n - 1\) 个点的二叉树个数 \(* n\) .

我们要求的是 \(g[i] \over f[i]\) , 也就是 \(f[i - 1] * n \over f[i]\) , 由卡特兰数的递推式可以简单的得到结果就是 \(n(n + 1) \over n(2n - 1)\) .

\(code:\)

#include <bits/stdc++.h>
int main() {
    double n;
    scanf("%lf", &n);
    printf("%.9lf", n * (n + 1) / (4 * n - 2));
    return 0;
}
posted @ 2021-08-30 07:46  sshadows  阅读(28)  评论(0编辑  收藏  举报