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*(n+1)/(2*(2*n-1)));
    return 0;
}

 

posted @ 2019-08-16 08:19  LLTYYC  阅读(125)  评论(0编辑  收藏  举报