题目描述

输入

输入一个正整数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);
}

BZOJ4001[TJOI2015]概率论——卡特兰数的更多相关文章

  1. BZOJ4001:[TJOI2015]概率论(卡特兰数,概率期望)

    Description Input 输入一个正整数N,代表有根树的结点数 Output 输出这棵树期望的叶子节点数.要求误差小于1e-9 Sample Input 1 Sample Output 1. ...

  2. [TJOI2015]概率论[卡特兰数]

    题意 \(n\) 个节点二叉树的叶子节点的期望个数. \(n\leq 10^9\) . 分析 实际询问可以转化为 \(n\) 个点的不同形态的二叉树的叶子节点总数. 定义 \(f_n\) 表示 \(n ...

  3. luoguP3978 [TJOI2015]概率论 卡特兰数

    考虑分别求出$f_n, g_n$表示$n$个点的有根二叉树的数量和$n$个点的所有情况下有根二叉树的叶子结点的总数 有$f_n = \sum_{k} f_k * f_{n - 1 - k}$,因此有$ ...

  4. bzoj4001: [TJOI2015]概率论

    题目链接 bzoj4001: [TJOI2015]概率论 题解 生成函数+求导 设\(g(n)\)表示有\(n\)个节点的二叉树的个数,\(g(0) = 1\) 设\(f(x)\)表示\(n\)个节点 ...

  5. BZOJ4001 TJOI2015概率论(生成函数+卡特兰数)

    设f(n)为n个节点的二叉树个数,g(n)为n个节点的二叉树的叶子数量之和.则答案为g(n)/f(n). 显然f(n)为卡特兰数.有递推式f(n)=Σf(i)f(n-i-1) (i=0~n-1). 类 ...

  6. 2018.12.31 bzoj4001: [TJOI2015]概率论(生成函数)

    传送门 生成函数好题. 题意简述:求nnn个点的树的叶子数期望值. 思路: 考虑fnf_nfn​表示nnn个节点的树的数量. 所以有递推式f0=1,fn=∑i=0n−1fifn−1−i(n>0) ...

  7. BZOJ4001 [TJOI2015]概率论 【生成函数】

    题目链接 BZOJ4001 题解 Miskcoo 太神了,orz #include<algorithm> #include<iostream> #include<cstr ...

  8. [TJOI2015] 概率论 - Catalan数

    一棵随机生成的 \(n\) 个结点的有根二叉树(所有互相不同构的形态等概率出现)的叶子节点数的期望.\(n \leq 10^9\) Solution \(n\) 个点的二叉树个数即 Catalan 数 ...

  9. 【BZOJ4001】[TJOI2015] 概率论(卡特兰数)

    点此看题面 大致题意: 问你一棵\(n\)个节点的有根二叉树叶节点的期望个数. 大致思路 看到期望,比较显然可以想到设\(num_i\)为\(i\)个节点的二叉树个数,\(tot_i\)为所有\(i\ ...

随机推荐

  1. Android学习之基础知识二(build.gradle文件详解)

    一.详解build.gradle文件 1.Android Studio是采用Gradle来创建项目的,Gradle是非常先进的构建的项目的工具,基于Groovy领域特定的语言(DSL)来声明项目配置, ...

  2. Luogu4249 WC2007 石头剪刀布 费用流

    传送门 考虑竞赛图三元环计数,设第\(i\)个点的入度为\(d_i\),根据容斥,答案为\(C_n^3 - \sum C_{d_i}^2\) 所以我们需要最小化\(\sum C_{d_i}^2\) 考 ...

  3. DataWorks使用小结(一)——概述

    一.概述 DataWorks数据工场,是MaxComputer的可视化开发平台,一站式开发.管理界面 1.功能概述 1.强大调度:支持分钟到月的调度 2.多种任务:支持ODPS.SHELL等多种任务 ...

  4. LiveCharts文档-2FAQ

    原文:LiveCharts文档-2FAQ LiveCharts文档-2FAQ 原文链接 LiveCharts基于的平台有WPF,UWP,WinForms:语言是C#, FAQ: 我怎么转换一个char ...

  5. 使用sklearn进行K_Means聚类算法

    首先附上官网说明 [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#examples-usin ...

  6. .Net版本依赖之坑引发的搜查

    前言 今天上午,一个客户反馈XX消息没有推送到第三方链接.于是我查看了推送日志列表,并没有今天的.接着登录服务器查询文件日志,看到了记录.我们的代码步骤是消息先推送到消息队列,消费消息队列时,记录文件 ...

  7. JVM规范系列:总结

    我们花了几天的时间来阅读<Java虚拟机规范>,了解要实现一个虚拟机应该包括什么内容.通过这么一次阅读,我们大致了解了虚拟机规范的内容. 第1章.对Java虚拟机进行了一些简单的介绍. 第 ...

  8. Kafka基础系列第1讲:Kafka的诞生背景及应用

    Kafka 是由 LinkedIn 开发的一个分布式的消息系统,使用 Scala 编写,它以可水平扩展和高吞吐率而被广泛使用.目前越来越多的开源分布式处理系统如 Cloudera.Apache Sto ...

  9. C#_XML与Object转换

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.X ...

  10. Azure Load Balancer : 支持 IPv6

    越来越多的网站开始支持 IPv6,即使是哪些只提供 api 服务的站点也需要支持 IPv6,比如苹果应用商店中的 app 早就强制要求服务器端支持 IPv6 了.笔者在前文<Azure Load ...