我以为我不会忘记的qaq
还是写一写推导吧qaq,方便后人
首先设hn表示n个节点的二叉树的形态数
那么我们有
hn=∑i=1n−1hi∗hn−1−i,h0=1,h1=1
h
n
=
∑
i
=
1
n
−
1
h
i
∗
h
n
−
1
−
i
,
h
0
=
1
,
h
1
=
1
写出
hn
h
n
的生成函数:
f(x)=1+x+2x2+5x3+...
f
(
x
)
=
1
+
x
+
2
x
2
+
5
x
3
+
.
.
.
f2(x)=1+2x+5x2+...
f
2
(
x
)
=
1
+
2
x
+
5
x
2
+
.
.
.
f2(x)=f(x)−1x
f
2
(
x
)
=
f
(
x
)
−
1
x
解方程得
f(x)=1±1−4x√2x
f
(
x
)
=
1
±
1
−
4
x
2
x
由于收敛性我们去掉一个根,得到
f(x)=1−1−4x√2x
f
(
x
)
=
1
−
1
−
4
x
2
x
用广义二项式定理展开,可以得到
xn
x
n
的系数为
Cn2nn+1
C
2
n
n
n
+
1
,也就是卡特兰数。
设sn表示n个节点的二叉树的叶子数
那么我们有
sn=∑i=1n−1si∗hn−1−i,s0=0,s1=1
s
n
=
∑
i
=
1
n
−
1
s
i
∗
h
n
−
1
−
i
,
s
0
=
0
,
s
1
=
1
写出
sn
s
n
的生成函数:
g(x)=0+x+2x2+6x3+10x4...
g
(
x
)
=
0
+
x
+
2
x
2
+
6
x
3
+
10
x
4
.
.
.
f(x)∗g(x)=x+3x2+5x3+...
f
(
x
)
∗
g
(
x
)
=
x
+
3
x
2
+
5
x
3
+
.
.
.
f(x)∗g(x)=g(x)−x2x
f
(
x
)
∗
g
(
x
)
=
g
(
x
)
−
x
2
x
将
f(x)
f
(
x
)
带入,得到
g(x)=x1−4x√
g
(
x
)
=
x
1
−
4
x
同样用二项式展开可以得到
xn
x
n
的系数为
Cn−12n−2
C
2
n
−
2
n
−
1
因此答案就是
snhn=n(n+1)4n+2
s
n
h
n
=
n
(
n
+
1
)
4
n
+
2
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 500010
inline char gc(){
static char buf[1<<16],*S,*T;
if(S==T){T=(S=buf)+fread(buf,1,1<<16,stdin);if(T==S) return EOF;}
return *S++;
}
inline int read(){
int x=0,f=1;char ch=gc();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=gc();
return x*f;
}
int n;
int main(){
// freopen("a.in","r",stdin);
n=read();
printf("%.9lf\n",n*1.0*(n+1)/((ll)4*n-2));
return 0;
}