洛谷传送门
BZOJ传送门
LOJ传送门
解析:
首先我们知道 n n n个点的所有有根非同构二叉树个数是Catlan数,通项公式为 f n = ( 2 n n ) n + 1 f_n=\frac{2n\choose n}{n+1} fn=n+1(n2n)
设 g n g_n gn表示所有 n n n个点的非同构有根二叉树的叶子节点个数。
我们要求的其实就是 g n f n \frac{g_n}{f_n} fngn
经过OEIS打表可以发现
g
n
=
n
f
n
−
1
g_n=nf_{n-1}
gn=nfn−1。
其实证明很简单,考虑对于所有 n n n的点的二叉树的叶子,我们将它删去,可以得到一个唯一的 n − 1 n-1 n−1个点的二叉树,而一个 n − 1 n-1 n−1个点的二叉树有 n n n个位置可以长出一个叶子,由此每个 n − 1 n-1 n−1点二叉树贡献了 n n n个叶子。
然后把Catlan通项公式代进去算一算就行了。
代码:
#include<bits/stdc++.h>
using namespace std;
double n;
signed main(){
cin>>n;
cout<<fixed<<setprecision(9)<<(n*(n+1))/(2*(2*n-1));
return 0;
}