P3978 [TJOI2015]概率论

\(\color{#0066ff}{ 题目描述 }\)

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

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

\(\color{#0066ff}{输入格式}\)

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

\(\color{#0066ff}{输出格式}\)

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

\(\color{#0066ff}{输入样例}\)

1
    
3

\(\color{#0066ff}{输出样例}\)

1.000000000

1.200000000

\(\color{#0066ff}{数据范围与提示}\)

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

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

对于100%的数据,1 ≤ n ≤ \(10^9\)

\(\color{#0066ff}{ 题解 }\)

根据概率,显然\(ans=\frac{\sum二叉树叶子节点个数}{二叉树个数}\)

n个点的二叉树个数为\(Catalan(n)\)

考虑第n个点的位置(作为叶子节点),通过手胡,可以发现有n个位置可以作为叶子节点,于是方案为\(Catalan(n-1)\)

因此。。。\(ans=\frac{Catalan(n-1)*n}{Catalan(n)}\)

化简一下就是\(\frac{n*(n+1)}{4*n-2}\)

#include<bits/stdc++.h>
#define LL long long
LL in() {
	char ch; LL x = 0, f = 1;
	while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);
	for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));
	return x * f;
}
double n;
int main() {
	n = in();
	printf("%.10f", (double)((n) * (n + 1)) / (4.0 * n - 2));
	return 0;

}
posted @ 2019-01-16 17:37  olinr  阅读(137)  评论(0编辑  收藏  举报