bzoj4001: [TJOI2015]概率论

Posted sssy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj4001: [TJOI2015]概率论相关的知识,希望对你有一定的参考价值。

题目链接

bzoj4001: [TJOI2015]概率论

题解

生成函数+求导
(g(n))表示有(n)个节点的二叉树的个数,(g(0) = 1)
(f(x))表示(n)个节点的二叉树叶子节点的个数,(f_0 = 0,f_1 = 1)
那么(ans = frac{f_i}{g_i})
对于(g_i)
考虑有一颗(n)个点的二叉树,由于左右字数都是二叉树,枚举左右子树的点数
[g_n = sum_{i = 0}^{n - 1}g_ig_{n - i - 1}]
这就是卡特兰数,通项为(frac{C_{2n}^{n}}{n + 1})
对于(f_i)
枚举左右子树的大小,我们可以有(g)函数推出,由于左右对称,最后(*2)
[f_n = 2sum_{i = 0}^{n - 1}f_i*g_{n - i - 1}]
我们要找到(f)(h)的关系
(G(x))(g)的生成函数,(F(x))(f)的生成函数
[G(x) = x G^2(x) + 1,F(x) = 2xF(x)G(x) + x]
对于(G(x))他的封闭形式为(frac{1-sqrt{1-4x}}{2x}),(对于另外一根不收敛,舍去)
(F(x))得到(F(x) = x * (1 - 4x)^{-frac{1}{2}})

[(xG(x))'=frac 1{sqrt{1-4x}}=frac{F(x)}x]
(xG(x))的每一项(xg_nx^n = g_nx^{n +1})求导后变为((n + 1)g_nx^n),也就等于等式右边的(frac{f_{n + 1}x^{n + 1}}{x} = f_{n + 1}x^n) 也就是说(f_{n + 1} = (n+1)g_n)(f_n=g_{n-1})
带入(g_n =frac{C_{2n}^{n}}{n + 1})
化简得到
[ans =frac{n(n + 1)}{2(2n + 1)}]

代码

#include<bits/stdc++.h> 
using namespace std; 
inline int read() { 
    int x = 0,f = 1; 
    char c = getchar(); 
    while(c < '0' || c > '9')c = getchar(); 
    while(c <= '9' && c >= '0')x = x * 10 + c - '0',c = getchar(); 
    return x * f; 
} 
const int maxn = 1000005;
const int INF = 0x7fffffff; 


int main() { 
    double n; 
    cin >> n; 
    printf("%.9lf
",n * (n + 1.0) / (4 * n  -2)); 
    return 0; 
} 
 

以上是关于bzoj4001: [TJOI2015]概率论的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 4001 [TJOI2015]概率论 ——找规律

BZOJ4001 [TJOI2015]概率论

BZOJ 4001[TJOI2015]概率论

并不对劲的bzoj4001:loj2105:p3978:[TJOI2015]概率论

LG P3978 [TJOI2015]概率论

luogu P3978 [TJOI2015]概率论