zoukankan      html  css  js  c++  java
  • P3978 [TJOI2015]概率论

    传送门

    $rqy$ 的题解好神啊....

    设 $f_n$ 表示 $n$ 个点的二叉树个数,$g_n$ 表示所有 $f_n$ 颗二叉树的叶子节点总数

    那么答案就是 $g_n/f_n$,首先 $f_n$ 显然就是 $Catalan$ 数列

    打表可以发现 $g_n=nf_{n-1}$,证明很神

    因为一个 $n$ 个节点的二叉树,假设有 $k$ 个叶子,那么依次删除这 $k$ 个叶子就会得到 $k$ 个 $n-1$ 个节点的二叉树

    而 $g_n$ 其实就是所有 $n$ 个节点的二叉树,删除叶子的次数和,也等于删除后出现的二叉树数量(可以相同)

    对于一个 $n-1$ 个节点的二叉树,显然它一定有且只有 $n$ 位置可以挂叶子,那么从 $n$ 个节点删成 $n-1$ 个节点时这颗树就会出现 $n$ 次

    所以得到 $g_n=nf_{n-1}$

    然后化一波式子就可以得到答案了

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    using namespace std;
    typedef long long ll;
    typedef long double ldb;
    inline int read()
    {
        int x=0,f=1; char ch=getchar();
        while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
        while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
        return x*f;
    }
    ldb n;
    int main()
    {
        n=read();
        printf("%.12Lf
    ",n*(n+1)/(2*(2*n-1)));
        return 0;
    }
  • 相关阅读:
    关键字static在C和C++中的区别
    C指针声明解读之左右法则
    各大公司面试题集锦
    C++的const和static的用法
    C++11常用特性总结
    C++多态下的访问修饰符
    #define 宏实现函数功能可能存在的问题
    Qt读写Json
    C/C++ 内存与指针
    C++ delete仍可访问的问题
  • 原文地址:https://www.cnblogs.com/LLTYYC/p/11361626.html
Copyright © 2011-2022 走看看