[Luogu P3978] [BZOJ 4001] [TJOI2015]概率论

版权声明:欢迎转载蒟蒻博客,但请注明出处: https://blog.csdn.net/LPA20020220/article/details/85092845

洛谷传送门

BZOJ传送门

题目描述

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

判断两棵树是否同构的伪代码如下:

img

输入输出格式

输入格式:

输入一个正整数 n n ,表示有根树的结点数

输出格式:

输出这棵树期望的叶子节点数,要求误差小于 1 e 9 1e-9

输入输出样例

输入样例#1:

1

输出样例#1:

1.000000000

输入样例#2:

3

输出样例#2:

1.200000000

说明

数据范围

对于30%的数据, 1 n 10 1 ≤ n ≤ 10

对于70%的数据, 1 n 100 1 ≤ n ≤ 100

对于100%的数据, 1 n 1 0 9 1 ≤ n ≤ 10^9

解题分析

大佬们都用生成函数做, 蒟蒻只会拿卡特兰数来讨论…

考虑 n 1 n-1 个节点的树, 设 f ( n 1 ) f(n-1) 表示树的总个数, 其有 n n 种方式在某个位置挂上一个点变成 n n 个点的树, 而这种方式可以看做对应的 n n 的点的树的一个叶节点贡献的方案, 所以实际上叶节点数 g ( n ) = n f ( n 1 ) g(n)=nf(n-1)

而大家都知道 f ( n ) = C a t a l a n ( n ) f(n)=Catalan(n)

所以答案等于 n C a t ( n 1 ) C a t ( n ) \frac{nCat(n-1)}{Cat(n)} 。 化简后得到 n ( n + 1 ) 4 n 2 \frac{n(n+1)}{4n-2}

代码如下:

#include <cstdio>
using namespace std;
int main(void)
{
	int n;
	scanf("%d", &n);
	printf("%.9lf", 1.0 * (n + 1) * n / (1.0 * n * 4 - 2));
}

猜你喜欢

转载自blog.csdn.net/LPA20020220/article/details/85092845