题目
题目描述
为了提高智商,ZJY开始学习概率论。有一天,她想到了这样一个问题:对于一棵随机生成的n个结点的有根二叉树(所有互相不同构的形态等概率出现),它的叶子节点数的期望是多少呢?
判断两棵树是否同构的伪代码如下:
输入格式
输入一个正整数n,表示有根树的结点数
输出格式
输出这棵树期望的叶子节点数,要求误差小于1e-9
输入输出样例
输入 #1复制
1
输出 #1复制
1.000000000
输入 #2复制
3
输出 #2复制
1.200000000
说明/提示
数据范围
对于30%的数据,1 ≤ n ≤ 10
对于70%的数据,1 ≤ n ≤ 100
对于100%的数据,1 ≤ n ≤ 10^9
思路
数论算个屁,打表找规律
设f(n)为n个点的二叉树个数,g(n)为n个点的所有二叉树叶子结点的总和,那么ans=g(n)/f(n)
然后打一个表发现g(n)=n*f(n-1)
其实证明也不难
对于每棵n个点的二叉树,如果里面有k个叶节点,那么我们分别把这k个叶子删去会得到kk棵n-1个点的二叉树;
而每棵n-1个点的二叉树恰好有n个位置可以悬挂一个新的叶子,所以每棵n-1个点的二叉树被得到了n次
综上,我们即可得出结论:所有n个点的二叉树的叶子个数和等于n-1个点的二叉树个数×n
只要求出f(n)即可
代码
#include<bits/stdc++.h>
int main()
{
double n;
scanf("%lf",&n);
printf("%.12f",n*(n+1)/(2*(2*n-1));
}