[TJOI2015]概率论

传送门

Loj
BZOJ

Solution

我们考虑一下设(f(x))表示当(n)(x)时构造二叉树的方案数,(g(x))表示当(n)(x)时构造二叉树的叶子节点数的总和.
仔细看一下这个句子:当$n$为$x$时构造二叉树的方案数.(Catalan)数无疑了,接着就是解决(g(x))是什么.
现在不是有(g(x))个叶子对吧,那么我们把这些叶子分别删掉,那么就是(g(x))(n-1)的节点的树.
然后算上贡献就是(f(x-1)*x)对吧.
接着你可以写出一个式子:

[Ans=frac{(2n-2)!n!(n+1)!}{(2n)!(n-1)!n!} \ =frac{n(n+1)}{2*(2n-1)} ]

代码实现

/*
  mail: mleautomaton@foxmail.com
  author: MLEAutoMaton
  This Code is made by MLEAutoMaton
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<iostream>
using namespace std;
#define ll long long
#define re register
#define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)
inline ll gl()
{
	ll f=1,sum=0;char ch=getchar();
	while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
	return f*sum;
}
ll n;
int main()
{
	n=gl();
	printf("%.9lf
",n*(n+1)*1./((2*n-1)*2));
	return 0;
}
原文地址:https://www.cnblogs.com/mleautomaton/p/10895438.html