zoukankan      html  css  js  c++  java
  • BZOJ4001[TJOI2015]概率论——卡特兰数

    题目描述

    输入

    输入一个正整数N,代表有根树的结点数

    输出

     输出这棵树期望的叶子节点数。要求误差小于1e-9

    样例输入

    1

    样例输出

    1.000000000

    提示

     1<=N<=10^9

    设$f[n]$表示$n$个节点能形成二叉树的方案数,$g[n]$表示所有方案的叶子数之和

    $ans=frac{g[n]}{f[n]}$,f$[n]$就是卡特兰数(这是卡特兰数的一个应用)

    那么$g[n]$怎么求呢?

    假设一种$n$节点二叉树有$k$个叶子,那么$g[n]=sum k$

    我们将这$k$个叶子中任意一个点删除都能得到一种形态的$n-1$节点二叉树

    那么$g[n]$就是所有$n$节点二叉树删除一个节点能得到的$n-1$节点二叉树的方案数之和

    这样还是求不了啊?

    我们反过来看,将$g[n]$看成是$n-1$节点二叉树加一个节点能形成$n$节点二叉树的方案数之和

    考虑对于一种形态的$n-1$节点二叉树,每个点能向下连出两条边(连向左儿子和右儿子的边),$n-1$个节点就有$2n-2$条边

    因为将这$n-1$个点连成一棵树已经占用了$n-2$条边,所以还有$n$条边的下端是空闲的,在这$n$条边下端任意一个位置加一个点都能形成一种形态的$n$节点二叉树

    每种形态$n-1$节点二叉树都能形成$n$种$n$节点二叉树,共$f[n-1]$种形态,因此$g[n]=n*f[n-1]$

    $f[n]=C_{2n}^{n}-C_{2n}^{n-1}=frac{(2n)!}{n!(n+1)!}$,$ans=frac{g[n]}{f[n]}=frac{n*(n+1)}{2(2n-1)}$

    #include<set>
    #include<map>
    #include<queue>
    #include<cmath>
    #include<stack>
    #include<cstdio>
    #include<vector>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define ll long long
    using namespace std;
    int n;
    double ans;
    int main()
    {
        scanf("%d",&n);
        ans=1.0*n*(n+1)/2;
        ans/=(2.0*n-1);
        printf("%.9lf",ans);
    }
  • 相关阅读:
    ECSHOP热门搜索关键词随机显示
    最全面的常用正则表达式大全
    ToString()、Convert.ToString()、(string)、as string 的区别
    RabbitMQ Server的安装、配置及常用命令
    RabbitMQ 学习资料
    使用dynamic来简化反射实现
    C#4.0中的dynamic关键字和ExpandoObject对象
    Erlang
    RestSharp使用备忘
    mysql group by的特殊性
  • 原文地址:https://www.cnblogs.com/Khada-Jhin/p/9833479.html
Copyright © 2011-2022 走看看