洛谷·[TJOI2015]概率论

初见安~这里是传送门:洛谷P3978 [TJOI2015]概率论

 

题解

这题推一推式子就出来了,很简单的。

首先两个二叉树不同当且仅当左右子树结构不同,与点的编号没有关系。

沿用大佬rqy的思路,我们设f_i表示i个点的二叉树的个数,g_i表示所有f_i个二叉树的叶子节点数的和。那么答案就是\frac{g_i}{f_i}

接着我们用f把g表示出来。可以发现,一棵n个结点的二叉树一定有n+1个位置可以挂叶子。因为一个结点时有两个位置,挂上一个结点相当于用了一个位置,并带来两个位置。所以表示出来就是:

g_i=f_{i-1}*i

这样一来f和g求出任一个就可以了。显然f会好求一些。因为是二叉树,所以可以枚举左右子树的大小:

\\ f_n=\sum_{i=1}^{n-1}f_if_{n-i-1}边界f1=1。

其实这就是一个Catalan数的基本数列了。可得f_n=\frac{C_{2n}^n}{n+1}

所以最后的最后答案就是\frac{n(n+1)}{2(2n-1)}

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#include<map>
using namespace std;
typedef long long ll;
int read() {
	int x = 0, f = 1, ch = getchar();
	while(!isdigit(ch)) {if(ch == '-') f = -1; ch = getchar();}
	while(isdigit(ch)) x = (x << 1) + (x << 3) + ch - '0', ch = getchar();
	return x * f;
}

int n;
signed main() {
	n = read();
	printf("%.10Lf\n", (long double)(1.0 * n * (n + 1) / 2.0 / (2 * n - 1)));
	return 0;
}

迎评:)
——End——

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值