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)。
类似地,左子树节点数为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概率论(生成函数+卡特兰数)相关推荐
- [BZOJ4001] [TJOI2015] 概率论 [期望计数] [卡特兰数打表 / 生成函数广义二项式定理]
[Link\frak{Link}Link] 预备结论们 卡特兰数 Cn=(2nn)−(2nn±1)C_n={2n\choose n}-{2n\choose n\pm1}Cn=(n2n)−(n±12 ...
- BZOJ4001[TJOI2015]概率论——卡特兰数
题目描述 输入 输入一个正整数N,代表有根树的结点数 输出 输出这棵树期望的叶子节点数.要求误差小于1e-9 样例输入 1 样例输出 1.000000000 提示 1<=N<=10^9 设 ...
- BZOJ4001[TJOI2015]概率论(数学、期望、生成函数、卡特兰数)
题目传送:https://www.lydsy.com/JudgeOnline/problem.php?id=4001 Description Input 输入一个正整数N,代表有根树的结点数 Outp ...
- P3978 [TJOI2015]概率论(生成函数)
P3978 [TJOI2015]概率论 设fif_ifi表示节点数为iii的二叉树有多少,gig_igi表示节点数为iii的二叉树有多少叶子节点. fn=∑i=0n−1fifn−1−if_n = ...
- [集训队作业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 ...
- bzoj 4001: [TJOI2015]概率论(找规律)
4001: [TJOI2015]概率论 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1033 Solved: 545 [Submit][Stat ...
- 洛谷 P3978 [TJOI2015]概率论
传送门 题目描述 为了提高智商,ZJY开始学习概率论.有一天,她想到了这样一个问题:对于一棵随机生成的n个结点的有根二叉树(所有互相不同构的形态等概率出现),它的叶子节点数的期望是多少呢? 输入格式 ...
- 卡特兰数通项公式详细推导过程
设法求解下面这个递归式或给出其最低上界的阶,设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) ...
- 卡特兰数通项公式(母函数,牛顿展开)
组合意义非常显然,经典的路径问题.这里主要讨论母函数以及牛顿展开的证明. 考虑卡特兰数的递推式,发现这是一个卷积式 令f(x)f(x)f(x)为卡特兰数的生成函数 可以将递推式表示为 f(x)=x∗f ...
最新文章
- freebsd+postfix+mysql+authdaemon+sasl2+bind9
- java泛型中?和T有什么区别?
- .NET Core中间件与依赖注入的一些思考
- 把 Rational Rose 的图表保存为图片文件
- mysql boolean 和bool_关于 MySQL 的 boolean 和 tinyint(1)
- 为什么python不需要编译_为什么我用Go写机器学习部署平台,而偏偏不用Python?...
- git(12)---Git的基础知识
- LeetCode(590)——N叉树的后序遍历(JavaScript)
- 提高效率--录制视频教程
- AD9361 补充(中)
- Server JRE 简介
- 什么是技术债,为什么要还技术债?
- 短信验证码被盗刷了怎么办?
- Microcontent - 微内容
- Android 高德地图key获取、坐标定位
- 微信小程序云开发-批量上传文件到云储存空间
- 嵌入式培养是什么意思 看完秒懂
- 计算机科学与技术学科简介,计算机科学与技术学科简介
- NOIP2016 略解
- 设机器数字长为8位(含1位符号位在内),写出对应下列各真值的原码、补码和反码。 -26/128,82
热门文章
- mac 终端登陆linux,Mac终端自动登录服务器
- 中希尔排序例题代码_【数据结构与算法】这或许是东半球分析十大排序算法最好的一篇文章...
- JS数据结构与算法——选择排序(把小的数字依次往前放)
- LeetCode 5832. 构造元素不等于两相邻元素平均值的数组
- LeetCode 1832. 判断句子是否为全字母句
- 05.序列模型 W3.序列模型和注意力机制
- LeetCode 679. 24 点游戏(回溯)
- LeetCode 727. 最小窗口子序列(滑动窗口)
- LeetCode 1152. 用户网站访问行为分析
- LeetCode MySQL 1211. 查询结果的质量和占比