bzoj4001 [TJOI2015]概率论(生成函数)

我以为我不会忘记的qaq
还是写一写推导吧qaq,方便后人
首先设hn表示n个节点的二叉树的形态数
那么我们有 hn=i=1n1hihn1i,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±14x2x f ( x ) = 1 ± 1 − 4 x 2 x
由于收敛性我们去掉一个根,得到
f(x)=114x2x f ( x ) = 1 − 1 − 4 x 2 x
用广义二项式定理展开,可以得到 xn x n 的系数为 Cn2nn+1 C 2 n n n + 1 ,也就是卡特兰数。
设sn表示n个节点的二叉树的叶子数
那么我们有 sn=i=1n1sihn1i,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)=x14x g ( x ) = x 1 − 4 x
同样用二项式展开可以得到 xn x n 的系数为 Cn12n2 C 2 n − 2 n − 1
因此答案就是 snhn=n(n+1)4n+2 s n h n = n ( n + 1 ) 4 n + 2

#include 
#include 
#include 
#include 
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;
}

你可能感兴趣的:(bzoj,生成函数,组合数学)