1 条题解

  • 0
    @ 2025-8-24 21:55:09

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar _rqy
    **

    搬运于2025-08-24 21:55:09,当前版本为作者最后更新于2018-06-02 18:51:51,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    ...这道题比楼下说的还要神奇——它不仅代码好写,证明也不用楼下说的那么麻烦。

    首先,我们令fnf_n表示nn个点的二叉树个数;gng_n表示nn个点的所有fnf_n棵二叉树的叶节点总数。

    找规律第一步当然是打表啦~写个爆搜或者手算都可以。

    n 1 2 3 4 5 ...
    fnf_n 1 2 5 14 42 ...
    gng_n 6 20 70

    我们发现一个规律:gn=nfn1g_n=nf_{n-1}

    证明这个规律其实超级简单:

    • 对于每棵nn个点的二叉树,如果里面有kk个叶节点,那么我们分别把这kk个叶子删去会得到kkn1n-1个点的二叉树;
    • 而每棵n1n-1个点的二叉树恰好有nn个位置可以悬挂一个新的叶子,所以每棵n1n-1个点的二叉树被得到了nn次;
    • 综上,我们即可得出结论:所有nn个点的二叉树的叶子个数和等于n1n-1个点的二叉树个数×n\times n

    那么我们只需要求出ff即可。而ff的递推式可以通过枚举左子树结点个数得到:

    fn=i=1n1fifni1f_n=\sum_{i=1}^{n-1}f_if_{n-i-1}

    边界是f1=1f_1=1。应该可以一眼看出来这是Catalan数列(其实一看那个1,2,5,14,421,2,5,14,42就应该知道,滑稽)

    于是答案即为

    gnfn=nfn1fn\frac{g_n}{f_n}=\frac{nf_{n-1}}{f_n}

    代入卡特兰数的通项公式fn=(2nn)n+1f_n=\frac{\binom{2n}{n}}{n+1}很容易就得到上式等于n(n+1)2(2n1)\frac{n(n+1)}{2(2n-1)}

    代码:

    #include <cstdio>
    
    int main() {
      double n;
      scanf("%lf", &n);
      printf("%.12f", n * (n + 1) / (2 * (2 * n - 1));
      return 0;
    }
    
    • 1

    信息

    ID
    2930
    时间
    1000ms
    内存
    125MiB
    难度
    6
    标签
    递交数
    0
    已通过
    0
    上传者