数论训练之四

https://www.luogu.org/problem/P3978

题目描述:

对于一棵随机生成的n个结点的有根二叉树(所有互相不同构的形态等概率出现),它的叶子节点数的期望是多少呢?

不同构的二叉树数目显然是卡特兰数(因为这题目描述的不同构节点标号也要不同

节点数期望是等于(各种情况的节点数)/(不同构二叉树数目)

那怎么算各种情况的节点数之和呢?有点技巧了

考虑n-1个点现在还没连边

此时第n个点就有2(n-1)个位置可以插入

又因为实际上他们是连了n-2条边的,所以实际上只有n个位置可以插入

又因为可以不同构,所以有n*卡特兰数(n-1)

code by jklover:

//%std
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int read()
{
    int out=0,fh=1;
    char jp=getchar();
    while ((jp>'9'||jp<'0')&&jp!='-')
        jp=getchar();
    if (jp=='-')
        fh=-1,jp=getchar();
    while (jp>='0'&&jp<='9')
        out=out*10+jp-'0',jp=getchar();
    return out*fh;
}
int main()
{
    double n=(double)read();
    double ans=n*(n+1)/2/(2*n-1);
    printf("%.9lf\n",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/wzxbeliever/p/11702781.html

时间: 2024-10-11 02:06:58

数论训练之四的相关文章

字符串训练之四

https://www.luogu.org/problem/P2264 看一眼就是水题 方法应该很多,都可以乱搞出来 我就找了两个比较好的做法 一个是trie,还有一个是set trie #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<queue> #include<stack> #include<map> #inc

数论训练之一

http://www.codevs.cn/problem/3223/ L,R的范围太大了,不可能直接筛素数 但考虑到R-L的范围在能承受的范围内, 这时候就要用到 区间筛: 主体思想与其他筛法一致, 但一般题目中数据范围比较大(L<R<=10^12),但也有个利于我们的限制条件(R-L<=10^6) 那就很简单了,根据我们熟知的理论, R以内的合数的最小质因数不会大于√R, 所以我们就可以筛出[1,√R]内的素数并用这些素数去筛除[a,b]的合数. code: #include<i

图论训练之四

https://www.luogu.org/problem/P2680 题意:n个点,n-1条边,边有边权,无向图,m条航线,0时刻同时启程,你可以将一个边权变为0,求使得最后一个航线到达最少花费时间. 这道题很早就做过了,但现在又忘了, 而且觉得这是一道好题,所以写一篇博客 分析: 首先最大值最小,二分毋庸置疑 当然是二分答案,但怎么判断就是本题的难点了 明确,删边一定是在最长的路线中删去(很好理解吧) 在此基础上 看能否有其他的路线经过删的边就更好 普及一下树上差分 如果是点差分,(a,b)

杂题训练之四

https://www.luogu.org/problem/P3650 真的是惭愧,拿到一个普及减的题,看了半天不会做,还要看题解 首先On*n的 首先对之进行排序 因为添加和减小高度都是无标准的,只要差值小于等于17就好 于是我们可以枚举一个这样的标准 小于它的变成它,大于它且大于差值大于17的,变成它 #include<cstdio> #include<algorithm> using namespace std; int a[1001],n; int sqr(int a) {

数据结构训练之四

https://www.luogu.org/problem/P2824#submit 做法: 由于将一个普通序列排序很慢,需要nlogn的时间,所以我们试着把它转化为对01序列排序.先来考虑一个简单的问题: 如何将一个01序列排序?(logn的复杂度) 对于这个问题,我们使用线段树来维护.查询一段区间内的1的个数记为cnt1,如果是升序,就将这段区间的[r-cnt1+1, r]都更改为1,将[l, r-cnt1]更改为0.降序则将[l, l+cnt1-1]更改为1,将[l+cnt, r]更改为0

校队训练赛,同时也是HDU4497(数论:素数分解+组合数学)

一.题目 http://acm.hdu.edu.cn/showproblem.php?pid=4497 二.思路 将满足条件的一组x,z,y都除以G,得到x‘,y',z',满足条件gcd(x',y',x') = 1,同时lcm(x',y',x') = G/L.特判,当G%L != 0 时,无解.然后素数分解G/L,假设G/L = p1^t1 * p2^t2 *````* pn^tn.满足上面条件的x,y,z一定为这样的形式.x' = p1^i1 * p2^i2 *```* pn^in.y' =

UESTC 电子科大专题训练 数论 L

UESTC 1723 题意:中文题 思路:预处理,dp[i][j]表示将j个人放到i个房间里,则可以得到dp[i][j]=dp[i][j-1]*i + dp[i-1][j-1],递推式的理解,第一:当有i个房间,j-1个人的时候方案数已知为dp[i][j-1],则当增加一个人的时候,第j个人可以选择i个房间的任意一个,或者选择一个新的房间,但是只有选择已有的i个房间才能递推得dp[i][j],第二:当有i-1个房间,j-1个人时,增加一个人,这个人有i+1种选择(i种选择为选择已有的房间,第i+

UESTC 电子科大专题训练 数论 G

UESTC 1718 题意:在01串中选出长度为偶数,并且前一半是0,后一半是1的子序列方案数 思路:组合数+范德蒙恒等式 记录每个数前面0的个数pi和后面1的个数nexi(包括本身)遍历到第k个数的时候,如果是0 那么方案数为(因为计算第i位时,前面计算的i-1个答案都不包含这一位,但是第i位计算的答案都包含第i位 所以没有重复) for(i=0, -> i=min(pi-1,nexi)) C(pi-1,i)*C(nexi,i+1) 可以由 C(l-1,i)=C(l,i+1)-C(l-1,i+

ACdream HUT新生摸底训练赛 E - 娜娜梦游仙境系列——莫名其妙的插曲 数论

解题思路:其实就是找能组成的最大集合.max(a[1],a[2],a[3].........a[n])/gcd(a[1],a[2],a[3],......a[n]) 解题代码: 1 // File Name: e.cpp 2 // Author: darkdream 3 // Created Time: 2015年04月13日 星期一 13时56分11秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #i