设f(n)为n个节点的二叉树个数,g(n)为n个节点的二叉树的叶子数量之和。则答案为g(n)/f(n)。

  显然f(n)为卡特兰数。有递推式f(n)=Σf(i)f(n-i-1) (i=0~n-1)。

  类似地,左子树节点数为i时右子树有f(n-i-1)种情况,那么可以对左子树的叶子节点数之和计数,显然再乘2就是总数了。有递推式g(n)=2Σg(i)f(n-i-1) (i=0~n-1)。

  因为递推式是卷积形式,考虑生成函数。设F(x)、G(x)分别为f(n)、g(n)的生成函数(均为无穷级数)。则有F(x)=xF2(x)+1。乘x是为了给他进一位。因为f(0)=f(1)=1,只要补上x^0位上的1就好了。解得F(x)=[1±√(1-4x)]/(2x)。其中√1-4x可以用广义二项式定理计算出来,发现其每一项都是负数,于是我们取F(x)=[1-√(1-4x)]/(2x)。

  同样的道理,G(x)=2xF(x)G(x)+x。因为g(0)=0,g(1)=1,进一位后需要补上x^1位上的1。解得G(x)=x/√(1-4x)。

  有了生成函数我们可以暴推原数列了。

  

  

  

  即g(n)=C(-1/2,n-1)·(-4)n-1。这个式子得化的更好看一点。不妨展开组合数。

  

  则C(-1/2,n)=(2n)!/(2n·n!)·(-1/2)n/n!=(-1/4)n·(2n)!/n!/n!=(-1/4)n·C(2n,n)。

  g(n)=(-1/4)n-1·C(2n-2,n-1)·(-4)n-1=C(2n-2,n-1)。简直优美到爆炸!

  我们知道卡特兰数的通项公式是f(n)=C(2n,n)/(n+1)。

  那么g(n)/f(n)=[(2n-2)!/(n-1)!/(n-1)!]/[(2n)!/n!/n!/(n+1)]=n2(n+1)/(2n)/(2n-1)=n(n+1)/2(2n-1)。

  于是一句话就做完了。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{int x=0,f=1;char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}
double n;
int main()
{
#ifndef ONLINE_JUDGEfreopen("bzoj4001.in","r",stdin);freopen("bzoj4001.out","w",stdout);const char LL[]="%I64d";
#elseconst char LL[]="%lld";
#endifn=read();printf("%.9lf",n*(n+1)/2/(2*n-1));return 0;
}

转载于:https://www.cnblogs.com/Gloid/p/9440525.html

BZOJ4001 TJOI2015概率论(生成函数+卡特兰数)相关推荐

  1. [BZOJ4001] [TJOI2015] 概率论 [期望计数] [卡特兰数打表 / 生成函数广义二项式定理]

    [Link\frak{Link}Link] 预备结论们 卡特兰数 Cn=(2nn)−(2nn±1)C_n={2n\choose n}-{2n\choose n\pm1}Cn​=(n2n​)−(n±12 ...

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

    题目描述 输入 输入一个正整数N,代表有根树的结点数 输出 输出这棵树期望的叶子节点数.要求误差小于1e-9 样例输入 1 样例输出 1.000000000 提示 1<=N<=10^9 设 ...

  3. BZOJ4001[TJOI2015]概率论(数学、期望、生成函数、卡特兰数)

    题目传送:https://www.lydsy.com/JudgeOnline/problem.php?id=4001 Description Input 输入一个正整数N,代表有根树的结点数 Outp ...

  4. P3978 [TJOI2015]概率论(生成函数)

    P3978 [TJOI2015]概率论 设fif_ifi​表示节点数为iii的二叉树有多少,gig_igi​表示节点数为iii的二叉树有多少叶子节点. fn=∑i=0n−1fifn−1−if_n = ...

  5. [集训队作业2018] count(笛卡尔树,生成函数,卡特兰数)

    传送门 什么情况下两序列同构 对于两序列A[1,n],B[1,n]A[1,n],B[1,n]A[1,n],B[1,n],设fA(1,n)=pa,fB(1,n)=pbf_A(1,n)=p_a,f_B(1 ...

  6. bzoj 4001: [TJOI2015]概率论(找规律)

    4001: [TJOI2015]概率论 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1033  Solved: 545 [Submit][Stat ...

  7. 洛谷 P3978 [TJOI2015]概率论

    传送门 题目描述 为了提高智商,ZJY开始学习概率论.有一天,她想到了这样一个问题:对于一棵随机生成的n个结点的有根二叉树(所有互相不同构的形态等概率出现),它的叶子节点数的期望是多少呢? 输入格式 ...

  8. 卡特兰数通项公式详细推导过程

    设法求解下面这个递归式或给出其最低上界的阶,设P(1)=1P(1)=1P(1)=1 P(n)=∑k=1n−1P(k)P(n−k)P(n)=\sum^{n-1}_{k=1}P(k)P(n-k) P(n) ...

  9. 卡特兰数通项公式(母函数,牛顿展开)

    组合意义非常显然,经典的路径问题.这里主要讨论母函数以及牛顿展开的证明. 考虑卡特兰数的递推式,发现这是一个卷积式 令f(x)f(x)f(x)为卡特兰数的生成函数 可以将递推式表示为 f(x)=x∗f ...

最新文章

  1. freebsd+postfix+mysql+authdaemon+sasl2+bind9
  2. java泛型中?和T有什么区别?
  3. .NET Core中间件与依赖注入的一些思考
  4. 把 Rational Rose 的图表保存为图片文件
  5. mysql boolean 和bool_关于 MySQL 的 boolean 和 tinyint(1)
  6. 为什么python不需要编译_为什么我用Go写机器学习部署平台,而偏偏不用Python?...
  7. git(12)---Git的基础知识
  8. LeetCode(590)——N叉树的后序遍历(JavaScript)
  9. 提高效率--录制视频教程
  10. AD9361 补充(中)
  11. Server JRE 简介
  12. 什么是技术债,为什么要还技术债?
  13. 短信验证码被盗刷了怎么办?
  14. Microcontent - 微内容
  15. Android 高德地图key获取、坐标定位
  16. 微信小程序云开发-批量上传文件到云储存空间
  17. 嵌入式培养是什么意思 看完秒懂
  18. 计算机科学与技术学科简介,计算机科学与技术学科简介
  19. NOIP2016 略解
  20. 设机器数字长为8位(含1位符号位在内),写出对应下列各真值的原码、补码和反码。 -26/128,82

热门文章

  1. mac 终端登陆linux,Mac终端自动登录服务器
  2. 中希尔排序例题代码_【数据结构与算法】这或许是东半球分析十大排序算法最好的一篇文章...
  3. JS数据结构与算法——选择排序(把小的数字依次往前放)
  4. LeetCode 5832. 构造元素不等于两相邻元素平均值的数组
  5. LeetCode 1832. 判断句子是否为全字母句
  6. 05.序列模型 W3.序列模型和注意力机制
  7. LeetCode 679. 24 点游戏(回溯)
  8. LeetCode 727. 最小窗口子序列(滑动窗口)
  9. LeetCode 1152. 用户网站访问行为分析
  10. LeetCode MySQL 1211. 查询结果的质量和占比