zoukankan      html  css  js  c++  java
  • 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}),(对于另外一根(sqrt{1-4x})展开后每一项都是是负的,而卡特兰数不是,舍去)
    (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=ng_{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; 
    } 
     
    
  • 相关阅读:
    C#基础知识——类的继承
    值传递与引用传递01
    今天接到任务了!
    傅立叶变换,时域,频域二
    傅立叶变换,时域,频域一
    常用运放选型一览表
    用三段140字符以内的代码生成一张1024×1024的图片
    [收藏夹整理]电子类链接
    [收藏夹整理]三维重构部分
    MSP430之自动增益程控放大main备份
  • 原文地址:https://www.cnblogs.com/sssy/p/9367548.html
Copyright © 2011-2022 走看看