解题思路
分两问处理
第一问
设
f
i
f_i
fi表示
i
i
i个叶子结点的平均深度的期望
则此时叶子结点的期望深度和为
i
×
f
i
i\times f_i
i×fi
观察题目给出的操作,实质是减少了一个叶子结点,新增了两个叶子结点,且这两个叶子结点的深度是原来+1,也就是
−
f
i
+
2
×
f
i
+
2
-f_i+2\times f_i+2
−fi+2×fi+2
所以答案为
f
i
=
(
i
−
1
)
×
f
i
−
1
+
f
i
−
1
+
2
i
f_i=\frac{(i-1)\times f_{i-1}+f_{i-1}+2}{i}
fi=i(i−1)×fi−1+fi−1+2
第二问
整数概率公式
E
(
x
)
=
∑
i
=
1
+
∞
P
(
i
≤
x
)
E(x)=\sum_{i=1}^{+\infty}P(i\leq x)
E(x)=∑i=1+∞P(i≤x)
这也就完成了概率向期望的转化
设
f
[
i
]
[
j
]
f[i][j]
f[i][j]表示
i
i
i个叶子节点,树的深度
≥
j
\geq j
≥j的概率
枚举左子树的叶子个数
则
f
[
i
]
[
j
]
=
∑
k
=
1
i
−
1
1
i
−
1
(
f
[
k
]
[
j
−
1
]
+
f
[
i
−
k
]
[
j
−
1
]
−
f
[
k
]
[
j
−
1
]
×
f
[
i
−
k
]
[
j
−
1
]
)
f[i][j]=\sum_{k=1}^{i-1}\frac{1}{i-1}(f[k][j-1]+f[i-k][j-1]-f[k][j-1]\times f[i-k][j-1])
f[i][j]=∑k=1i−1i−11(f[k][j−1]+f[i−k][j−1]−f[k][j−1]×f[i−k][j−1])
#include<bits/stdc++.h>
using namespace std;
typedef double db;
const int N = 100;
int n,q;
db f[N][N],ans=0;
int main()
{
cin>>q>>n;
if(q==1)
{
for(int i=2;i<=n;i++)
ans+=(2.0/i);
}
if(q==2)
{
for(int i=1;i<=n;i++)
{
f[i][0]=1.0;
for(int j=1;j<n;j++)
{
for(int k=1;k<i;k++)
f[i][j]+=1.0*(f[k][j-1]+f[i-k][j-1]-f[k][j-1]*f[i-k][j-1])/(i-1);
}
}
for(int i=1;i<n;i++)
ans+=f[n][i];
}
printf("%.6lf",ans);
return 0;
}