初见安~这里是传送门:洛谷P3978 [TJOI2015]概率论
题解
这题推一推式子就出来了,很简单的。
首先两个二叉树不同当且仅当左右子树结构不同,与点的编号没有关系。
沿用大佬rqy的思路,我们设表示i个点的二叉树的个数,表示所有个二叉树的叶子节点数的和。那么答案就是。
接着我们用f把g表示出来。可以发现,一棵n个结点的二叉树一定有n+1个位置可以挂叶子。因为一个结点时有两个位置,挂上一个结点相当于用了一个位置,并带来两个位置。所以表示出来就是:
;
这样一来f和g求出任一个就可以了。显然f会好求一些。因为是二叉树,所以可以枚举左右子树的大小:
边界f1=1。
其实这就是一个Catalan数的基本数列了。可得。
所以最后的最后答案就是。
#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——