题目描述 输入 输入一个正整数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$个叶子中…
Description Input 输入一个正整数N,代表有根树的结点数 Output 输出这棵树期望的叶子节点数.要求误差小于1e-9 Sample Input 1 Sample Output 1.000000000 HINT 1<=N<=10^9 Solution 好神仙一个题啊……rqy大爷的证明真的超简单明了QwQ膜拜rqy 首先设$f_n$表示$n$个点的二叉树个数,$g_n$表示$n$个点所有$f_n$棵二叉树的叶节点总数打个表可以发现:$f:1 ~2~ 5~ 14 ~42$$g:…
题意 \(n\) 个节点二叉树的叶子节点的期望个数. \(n\leq 10^9\) . 分析 实际询问可以转化为 \(n\) 个点的不同形态的二叉树的叶子节点总数. 定义 \(f_n\) 表示 \(n\) 个节点的二叉树的个数, \(g_n\) 表示 \(n\) 个节点的不同形态的二叉树的叶子节点总数. 设一棵 \(n\) 个节点的树有 \(m\) 个叶子节点,每删去一个叶子节点都可以得到一棵大小为 \(n-1\) 的二叉树,考虑每个大小为 \(n-1\) 的二叉树,共有 \(n\) 个叶子节点…
考虑分别求出$f_n, g_n$表示$n$个点的有根二叉树的数量和$n$个点的所有情况下有根二叉树的叶子结点的总数 有$f_n = \sum_{k} f_k * f_{n - 1 - k}$,因此有$f_n = C_n$,其中$C_n$为卡特兰数 有$g_n = \sum_{k} g_k * f_{n - 1 - k} + g_{n - 1 - k} * f_k$ 通过打表,可以发现$g_n = n * C_{n - 1}$,可以用归纳法证明 因此答案为$\frac{g_n}{f_n} = \f…
题目链接 bzoj4001: [TJOI2015]概率论 题解 生成函数+求导 设\(g(n)\)表示有\(n\)个节点的二叉树的个数,\(g(0) = 1\) 设\(f(x)\)表示\(n\)个节点的二叉树叶子节点的个数,\(f_0 = 0,f_1 = 1\) 那么\(ans = \frac{f_i}{g_i}\) 对于\(g_i\) 考虑有一颗\(n\)个点的二叉树,由于左右字数都是二叉树,枚举左右子树的点数 \[g_n = \sum_{i = 0}^{n - 1}g_ig_{n - i -…
设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…
传送门 生成函数好题. 题意简述:求nnn个点的树的叶子数期望值. 思路: 考虑fnf_nfn​表示nnn个节点的树的数量. 所以有递推式f0=1,fn=∑i=0n−1fifn−1−i(n>0)f_0=1,f_n=\sum_{i=0}^{n-1}f_if_{n-1-i}(n>0)f0​=1,fn​=∑i=0n−1​fi​fn−1−i​(n>0) 正是一个卷积的形式. 那么fnf_nfn​的生成函数F(x)=xF2(x)+1F(x)=xF^2(x)+1F(x)=xF2(x)+1 注意要填上…
题目链接 BZOJ4001 题解 Miskcoo 太神了,orz #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<map> #define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt) #define REP(i,n) for (int…
一棵随机生成的 \(n\) 个结点的有根二叉树(所有互相不同构的形态等概率出现)的叶子节点数的期望.\(n \leq 10^9\) Solution \(n\) 个点的二叉树个数即 Catalan 数 \(f(n)=\frac{C_{2n}^n}{n+1}\) 设 \(g(n)\) 为 \(n\) 个点的所有二叉树的叶子个数和,找规律得 \(g(n)=nf(n-1)\) Proof. 对于 \(n\) 个点,\(k\) 个叶子的二叉树,删掉任意一个叶子可以得到 \(k\) 个 \(n-1\) 个…
点此看题面 大致题意: 问你一棵\(n\)个节点的有根二叉树叶节点的期望个数. 大致思路 看到期望,比较显然可以想到设\(num_i\)为\(i\)个节点的二叉树个数,\(tot_i\)为所有\(i\)个节点的二叉树的叶节点总数. 则答案显然为\(\frac{tot_i}{num_i}\). 而\(num_i\)其实就是一个卡特兰数(这其实就是\(NOIP2018\)提高组初赛卷中\(T8\)的\(A\)选项改正后的结果啊),故可以得到\(num_i=(2n)!/(n+1)!/n!\). 通过找…
题目描述 为了提高智商,ZJY开始学习概率论.有一天,她想到了这样一个问题:对于一棵随机生成的n个结点的有根二叉树(所有互相不同构的形态等概率出现),它的叶子节点数的期望是多少呢? 判断两棵树是否同构的伪代码如下: 题解 样例\(1\)是这个意思 我们需要解出两部分的答案,\(f(n)\)表示\(i\)个节点的树的个数,这个就是经典的卡特兰数为了方便计算我们将通项公式写成\(f(n)=\frac{C^n_(2n)}{n+1}\)的形式. 我们在定义\(g(n)\)表示\(i\)个节点中所有形态的…
[BZOJ4001][TJOI2015]概率论(生成函数) 题面 BZOJ 洛谷 题解 这题好仙啊.... 设\(g_n\)表示\(n\)个点的二叉树个数,\(f_n\)表示\(n\)个点的二叉树的叶子个数. 最终要求的东西就是\(\frac{f_n}{g_n}\). 考虑这个玩意怎么转移,先考虑二叉树个数,即怎么求\(f_n\). 每次我们认为新加入的点作为根节点,那么接下来只需要枚举其左右子树大小就行了,所以得到: \[g_n=\sum_{i=0}^{n-1}g_ig_{n-1-i}\] 然…
题目描述 输入 输入一个正整数N,代表有根树的结点数 输出 输出这棵树期望的叶子节点数.要求误差小于1e-9 样例输入 1 样例输出 1.000000000 题解 生成函数+导数 先考虑节点个数为$n$的二叉树有多少个:$c_0=1,c_i=\sum\limits_{j=0}^{i-1}c_j*c_{i-j-1}$,显然这是Catalan数. 令其生成函数为$F(x)$,由其递推式可以列出方程:$F(x)=xF(x)^2+1$,解得: $F(x)=\frac{1-\sqrt{1-4x}}{2x}…
题目大意 随机生成一棵\(n\)(n\leq10^9)个节点的有根二叉树,问叶子结点个数的期望. 题解 subtask 1:\(n\leq100\),70pts 结论:不同的\(n\)个节点的有根二叉树有\(\frac{C_{2\times n}^{n}}{n+1}\)(也就是卡特兰数)个. 设\(f(i)\)表示\(i\)个节点的有根二叉树期望有几个叶子结点. 计算\(f(i)\)时考虑除根以外\(i-1\)个节点哪些放左边,哪些放右边.\(\Theta(n^2)\). subtask 2:\…
[TJOI2015]概率论 史上最短黑题 看起来一脸懵逼,没有取模,1e-9 根据期望定义,发现 分母是一个卡特兰数,,,,不能直接算 所以考虑怎么消掉一些东西 gn表示n个点的叶子个数和,fn表示n个点二叉树个数 结论:g(n)=n*f(n-1) 考虑每个n个点的树的叶子,分别拔掉所有k个叶子,给剩下的k个(n-1)个点的树打上标记 那么,g(n)就是n-1个点的所有的树被打的标记之和 一个n-1个点的树,有n个位置可以有叶子,恰好会被打n次标记! 然后,ans(n)=g(n)/f(n),f(…
题意: 给你一个数n,表示有n辆火车,编号从1到n,入站,问你有多少种出站的可能.    (题于文末) 知识点: ps:百度百科的卡特兰数讲的不错,注意看其参考的博客. 卡特兰数(Catalan):前几项为 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670- 令h(0)=1,h(1)=1,catalan数满足递推式:      h(n)= h(0…
卡特兰数又称卡塔兰数,英文名Catalan number,是组合数学中一个常出现在各种计数问题中出现的数列.由以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名,其前几项为 : 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796. 通项:f(n) = f(0)*f(n-1) + f(1)*f(n-2) + .......+ f(n-2)*f(1) + f(n-1)*f(0) n>=2 f(n)=f(n-1)*(4n-2)/(n+1) 应用场景:…
题意 求节点数为\(n\)的有根树期望的叶子结点数.(\(n \le 10^9\)) 分析 神题就打表找规律.. 题解 方案数就是卡特兰数,$h_0=1, h_n = \sum_{i=0}^{n-1} h_i h_{n-1-i} \(. 设叶子数量和为\)f_n\(,则得到\)f_n = 2 \sum_{i=0}^{n-1} f_i h_{n-1-i}$ 设\(H(x)\)表示\(h_n\)的母函数,\(F(x)\)表示\(f_n\)的母函数 容易得到:\[H(x) = x H^2(x) + 1…
题目背景 栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表. 栈有两种最重要的操作,即pop(从栈顶弹出一个元素)和push(将一个元素进栈). 栈的重要性不言自明,任何一门数据结构的课程都会介绍栈.宁宁同学在复习栈的基本概念时,想到了一个书上没有讲过的问题,而他自己无法给出答案,所以需要你的帮忙. 题目描述 宁宁考虑的是这样一个问题:一个操作数序列,从1,2,一直到n(图示为1到3的情况),栈A的深度大于n. 现在可以进行两种操作, 1.将一个数,从操作数序列的头…
卡特兰数:(是一个在计数问题中出现的数列) 一般项公式: 1.         或       2.   递归公式: 1.  或 2. 注:全部可推导. (性质:Cn为奇数时,必然出现在奇数项 2k-1. (除去第 0 项)) 应用举例: 1. 连乘的 n 个数加括号. 答案: Cn-1 2. 一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列?  答案:Cn 引申1:入栈看作 1 操作, 出栈看作 0 操作,则整个序列入栈出栈后从左到右遍历 1 和 0 组成的序列,1 的个…
先推荐一个关于卡特兰数的博客:http://blog.csdn.net/hackbuteer1/article/details/7450250. 卡特兰数一个应用就是,卡特兰数的第n项表示,现在进栈和出栈的次数都是n次,问最后栈空的合法序列的个数.其他例子见上面这个博客. 那么关于这个题目,我们先选出i次右移的(相当于进栈)次数,i次左移的(相当于出栈)次数,那么当前对答案做出的贡献就是C(n,2*i)*cat[i],枚举所有的i计算出答案即可. 代码如下: #include <stdio.h>…
Train Problem II Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Submit Status Description As we all know the Train Problem I, the boss of the Ignatius Train Station want to know if all the trains come in strict-increasing…
How Many Trees? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3397    Accepted Submission(s): 1964 Problem Description A binary search tree is a binary tree with root k such that any node v re…
题目大概就是求一个n个不同的数能构造出几种形态的二叉排序树. 和另一道经典题目n个结点二叉树不同形态的数量一个递推解法,其实这两个问题的解都是是卡特兰数. dp[n]表示用n个数的方案数 转移就枚举第几个数作为根,然后分成左右两子树,左右两子树的方案数的乘积就是这个数作根的方案数 另外就是题目得先找到[1,1e10]的perfect power,总共102230个:输入的区间[a,b],b-a>=1e6,也就是最多perfect power的个数大概就在a=1,b=1000001范围内,1110…
题目链接:UVa 10007 题意:统计n个节点的二叉树的个数 1个节点形成的二叉树的形状个数为:1 2个节点形成的二叉树的形状个数为:2 3个节点形成的二叉树的形状个数为:5 4个节点形成的二叉树的形状个数为:14 5个节点形成的二叉树的形状个数为:42 把n个节点对号入座有n!种情况 所以有n个节点的形成的二叉树的总数是:卡特兰数F[n]*n! 程序: import java.math.BigInteger; import java.util.Scanner; public class Ma…
Robot Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem Description There is a robot on the origin point of an axis.Every second, the robot can move right one unit length or do nothing.If the robot is on the…
Grids Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Problem Description 度度熊最近很喜欢玩游戏.这一天他在纸上画了一个2行N列的长方形格子.他想把1到2N这些数依次放进去,但是为了使格子看起来优美,他想找到使每行每列都递增的方案.不过画了很久,他发现方案数实在是太多了.度度熊想知道,有多少种放数字的方法能满足上面的条件?   Input 第一行为数…
Train Problem II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Description As we all know the Train Problem I, the boss of the Ignatius Train Station want to know if all the trains come in strict-increasi…
题意:共n张无中生有,m张攻击牌.每张攻击牌攻击力已知,敌方有p点血.随机洗牌.游戏开始,己方抽取一张手牌,若是无中生有则可再抽两张牌.求能在第一回合内将敌方杀死的概率. n+m <= 20, p <= 1000; 很明显,与卡特兰数有关,原先栈内数量为1,抽到无中生有即入栈,否则出栈. 枚举攻击牌,求出该攻击牌组合下,用完所有手牌将对方杀死的方案数,以及抽光所有牌将对方杀死的方案数(手牌有剩). 不算预处理的复杂度,每组数据的时间复杂度为O(2^m) #include <cstdio&…
题意:给定2行n列的长方形,然后把1—2*n的数字填进方格内,保证每一行,每一列都是递增序列,求有几种放置方法,对1000000007取余: 思路:本来想用组合数找规律,但是找不出来,搜题解是卡特兰数,而且还有一个难点在于N的范围是1000000,卡特兰数早已数千位,虽然有取余: 解决方法就是用在求卡特兰数的时候快速取余+带模除法: 卡特兰数递归公式1:K(n)=K(n-1) * ((4*n-2)/(n+1)); 组合数公式2:K[n] = C[2*n][n] /(n+1); 看公式1,有个除法…