【BZOJ 4001】[TJOI2015]概率论

1.其实这是一个纯数学题。题目链接。额,网上很多人都说好猜出来,这个我是不敢苟同,至少我觉得我是猜不出来,打表也打不出来。因为毫无规律可言。

2.其实这个题就是再说n个节点的二叉树叶子节点的期望是多少,ans=n*(n+1)/(2*(2*n-1)),n是节点个数。首先n个节点的二叉树种类是C_n个,C就是卡特兰数,这个题其实算一下所有的叶子节点有多少个就行了.但是很难算。考虑DP[i][j]代表i个节点,j个叶子的期望,那么转移很简单,但是无法优化,所以不是正解。这里是正解。推导看起来不是很容易,里面有一步大佬没有给出详细过程,于是有了这篇博客。

                                    

     就是这里,Catalan数的递推人尽皆知,但是生成函数好像很突兀就出来了,至于怎么来的,下面来推导一下。

    前置技能:生成函数。二项式求和常见公式等。

    首先考虑一个很经典的问题:汉诺塔问题。如果有n个盘子,那么移动的次数就是2^n-1.(这里的柱子默认是三根)。这个是怎么来的呢?递推公式啊!(大喊),是的,的确实从递推公式推出来的。但是为了前置知识,还是回顾一下它是怎么来的。

(1)假设hn为n个盘子需要移动的最小次数

(2)开始操作,首先把n-1个移动到另外一个柱子上,这使用hn-1次,然后移动最下面的大盘子,+1次,再把n-1个拿回来,+hn-1次。所以显然递推公式:

                                                             h_n=2*h_{n-1}+1

这个就是高中数列求和了,直接俄求和就可以得到hn的表达式。

    现在考虑hn这个数列,{h0,h1,h2,....hn},设g(x)为h数列的生成函数。

                                                            g(x)=\sum_{n=0}^{\infty}h_n*x^n

   对g(x)操作一下:

                                                          \\ g(x)=\sum_{n=0}^{\infty}h_n*x^n=h_0+h_1*x^1+h_2*x^2...h_n*x^n...\\ -2x*g(x)=2h_0*x+2h_1*x^2....2h_{n-1}*x^n.....

两式相减,可以解出g(x):

                                                          g(x)=\frac{x}{(1-x)(1-2x)}

把g(x)列项,并泰勒展开可得:

                                                         g(x)=\frac{1}{1-2x}-\frac{1}{1-x}=\sum_{n=0}^{\infty}(2x)^n-\sum_{n=0}^{\infty}x^n=\sum_{n=0}^{\infty}(2^n-1)x^n

到了这里,根据生成函数第n项系数的含义,就知道hn=pow(2,n)-1.

      其实这个化简唯一有技巧的地方就在于对g(x)的配凑,然后把关于h的全部消掉。这里为啥会乘-2x啊,其实并不是空想的,从递推公式来的。

   那么现在,如何求卡特兰数的生成函数呢?

    好像,递推公式,和上一个不太像啊?

    继续沿用刚才的符号,假设hn代表第n项卡特兰数的值,hn的递推公式:g(x)^2=h_2x^2+h_3x^3+..h_nx^n+....

                                                           h_n=\sum_{j=0}^{n-1}h_j*h_{n-1-j}

   g(x)为hn的生成函数:

                                                        g(x)=h_1*x+h_2*x^2....h_n*x^n.....

  这个时候,观察hn的表达式,它是有它前边的n-1项确定的,再仔细发现一下,就可以看见,j+n-1-j=n-1.完了,看到这里惊为天人,这不就是卷积的定义?多项式乘法?FFT?循环卷积?的确是这样的,这也就是接下来的推导的Core。

      将g(x)做乘方:

                                 \\g(x)^2=(h_1x+h_2x^2...+h_n*x^n...)^2\\=h_1^2x^2+(h_1h_2+h_2h_1)x^3+...(h_1h_{n-1}+h_2h_{n-2}....h_{n-1}h_1)x^n+.....

可以发现,卷积完之后,每一项系数都是该次数对应的Catalan数,所以在化简一下:

                                g(x)^2=h_1^2x^2+h_3x^3...+h_nx^n+...

因为h1=h2=1,所以为了统一,把h1换为h2,那么就可以得到:

                               g(x)^2=h_2x^2+h_3x^3+...h_nx^n+...

这个式子就和g(x)有一项只差,就差了h1.所以也可以写作:

                              g(x)^2=g(x)-h_1x=g(x)-x

这是一个函数方程,把g(x)看作y解一元二次方程,就可以得到题解中的,

g(0)=0,会排除一个答案。所以答案只有一个。但这里就和大佬的题解衔接上了,其实这个题要是真的推,还是蛮困难的。如果知道了很多中间结论,哪会快很多。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值