[BZOJ4001] [TJOI2015] 概率论 [期望计数] [卡特兰数&打表 / 生成函数&广义二项式定理]

[ L i n k \frak{Link} Link]


预备结论们

卡特兰数 C n = ( 2 n n ) − ( 2 n n ± 1 ) C_n={2n\choose n}-{2n\choose n\pm1} Cn=(n2n)(n±12n) 同时 C n + 1 = ∑ i = 0 n C i C n − i C_{n+1}=\sum\limits_{i=0}^{n}C_iC_{n-i} Cn+1=i=0nCiCni

C 0 = 1 , C 1 = 1 , C 2 = 2 , C 3 = 5 , C 4 = 14 , C 5 = 42 C_0=1,C_1=1,C_2=2,C_3=5,C_4=14,C_5=42 C0=1,C1=1,C2=2,C3=5,C4=14,C5=42

一共有 C n C_n Cn 棵有 n n n 个结点的不同的有根二叉树


一些本题用不到的结论

显然有 C n = 4 n − 2 n + 1 ⋅ C n − 1 C_n = \frac{4n-2}{n+1}\cdot C_{n-1} Cn=n+14n2Cn1 用来递推
显然有 C n = 1 n + 1 ⋅ ( 2 n n ) C_n=\frac{1}{n+1}\cdot{2n\choose n} Cn=n+11(n2n) 通项公式

还可以 O ( l o g N ) O(logN) O(logN) C n r C_n^r Cnr 。不过数字大比较容易炸
怎么弄?利用二项式定理 ( 2 p + 1 ) n = ( n 0 ) + ( n 1 ) 2 p + ( n 2 ) ( 2 p ) 2 + ⋯ + ( n n ) ( 2 p ) n (2^p+1)^n={n\choose0}+{n\choose1}2^p+{n\choose2}(2^p)^2+\cdots+{n\choose n}(2^p)^n (2p+1)n=(0n)+(1n)2p+(2n)(2p)2++(nn)(2p)n
p = n p=n p=n 即可。然后按照 2 n 2^n 2n 进制(不是 2 进制!)来分离各位。

String 公式可以快速求阶乘。
另外也可以利用上面那个快速求组合数的方法,利用组合数快速求阶乘


思路

求叶子结点数的期望
时刻牢记:x 的期望 = 所有可能的 x 的和 A n A_n An / 情况数
情况数 即 有 n n n 个结点的不同的有根二叉树的个数 C n C_n Cn
现在要解决的就是:有 n n n 个结点的二叉树的叶子总数?


前戏

现在的问题形式很像生成函数。
不过在考虑具体推倒之前可以思考一种简单有效的方法:打表找规律。
为了防止打表出错,可以尝试手算 1 − 4 1-4 14 的小数据来对。

//打表。
//nSch[i][j] 表示 i 个点 j 个叶子的二叉树的数量
//不能太急,如果上来直接就打叶子总数,会很麻烦。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int MAXN = 1e4;
int nMax;
unsigned long long nTemp, nSch[MAXN][MAXN];
int main()
{
	cin >> nMax;
	nSch[0][0] = nSch[1][1] = 1;
	for (int nNodeSum = 2; nNodeSum <= nMax; ++nNodeSum)
	{
		for (int nLeaFSum = 1; nLeaFSum <= ((nNodeSum + 1) >> 1); ++nLeaFSum)
		{
			for (int nLeftNode = 0; nLeftNode < nNodeSum; ++nLeftNode)
			{
				for (int nLeftLeaF = 0; nLeftLeaF <= nLeaFSum; ++nLeftLeaF)
				{
					nSch[nNodeSum][nLeaFSum] += nSch[nLeftNode][nLeftLeaF] * nSch[nNodeSum - nLeftNode - 1][nLeaFSum - nLeftLeaF];
				}
			}
		}
	}
	for (int nLim, i = 1; i <= nMax; ++i)
	{
		nTemp = 0, nLim = (i + 1) >> 1;
		for (int j = 1; j <= nLim; ++j) nTemp += nSch[i][j] * j;
		printf("%d %lld\n", i, nTemp);
	}
	return 0;
}
20

1  1
2  2
3  6
4  20
5  70
6  252
7  924
8  3432
9  12870

--------------------------------
Process exited with return value 0
Press any key to continue . . .

打一个小表,貌似看不出什么。
这个增长…

慢慢试?比如分别全部 除2 除3 除4 … 然后打到一起,会发现跨表出现了 1 2 5 14 42 … 稳了。
看不出来的话试试对第 i 个除 i 然后一个很像卡特兰表的东西就摆在眼前辣。

或者你实际上也可以打 nSch[][] 的表,直接就能看出来。


推倒

∵ A n s n = n C n − 1 C n \because Ans_n = \frac{nC_{n-1}}{C_{n}} Ansn=CnnCn1
∵ C n = 4 n − 2 n + 1 C n − 1 \because C_{n}=\frac{4n-2}{n+1}C_{n-1} Cn=n+14n2Cn1
∴ A n s n = n ( n + 1 ) 4 n − 2 \therefore Ans_n = \frac{n(n+1)}{4n-2} Ansn=4n2n(n+1)
完了。

#include<cstdio>
double n;
int main()
{
	scanf("%lf", &n);
	printf("%.9f", n * (n + 1.0) / (n * 4.0 - 2.0));
	return 0;
}

二项式定理的推广

( a + b ) n = ∑ i = 0 n ( n i ) a i b n − i (a+b)^n=\sum\limits_{i=0}^n{n\choose i}a^ib^{n-i} (a+b)n=i=0n(in)aibni

现在 n n n 它飘了,不是正整数。
所以被咕的老实人 i i i 会一直取到 ∞ \infty 都等不到见到 n n n 的一天(惨

在生成函数问题里面,那个,收敛……所以可以用。
一般用到的是 ( 1 + x ) n = ∑ k = 0 ∞ ( n k ) x k (1+x)^n=\sum\limits_{k=0}^\infty{n\choose k}x^k (1+x)n=k=0(kn)xk
里面的 ( n k ) {n\choose k} (kn)是个表面组合数,它等于 n ( n − 1 ) ⋯ ( n − k + 1 ) k ! \displaystyle{\frac{n(n-1)\cdots(n-k+1)}{k!}} k!n(n1)(nk+1)

那么形式幂级数 ( 1 + x ) a (1+x)^a (1+x)a 展开后的第 k k k 项系数为 a ( a − 1 ) ⋯ ( a − k + 1 ) k ! \displaystyle{\frac{a(a-1)\cdots(a-k+1)}{k!}} k!a(a1)(ak+1)


关于生成函数?

序列的生成函数(母函数)的系数对应原序列。

对于序列 { a n } \{a_n\} {an} ,它的普通生成函数 ∑ n = 0 ∞ a n x n \sum\limits_{n=0}^\infty a_nx^n n=0anxn指数型生成函数 ∑ n = 0 ∞ a i ⋅ x n n ! \sum\limits_{n=0}^\infty a_i\cdot\frac{x^n}{n!} n=0ain!xn

把两个序列 { a n } \{a_n\} {an} { b n } \{b_n\} {bn} 的指数型生成函数相乘(做卷积)得到新的生成函数,
它对应的序列 { c n } \{c_n\} {cn} 通项 c n = ∑ i = 0 n ( n i ) a i b n − i c_n=\sum\limits_{i=0}^n{n\choose i}a_ib_{n-i} cn=i=0n(in)aibni

因为生成函数是形式幂级数,它的 x x x 可以瞎几把取,所以我们完全不用关心敛散性、
就是说不用讨论它的收敛半径啊、之类的。
就很开心。

剩下很多常用的套路不列了。


事后

大佬一眼,反正我是没看懂(
另外一种解释很好懂。
这道题还有加强版,没有找到题面

一种方法是把上面大佬一眼省略掉的那部分补全。要用生成函数。
构建 A n A_n An 的普通生成函数 α ( x ) \alpha(x) α(x) ,和 C n C_n Cn (卡特兰数)的普通生成函数 β ( x ) \beta(x) β(x)
首先简单分析一波我们有
A n = { 0 n = 0 1 n = 1 2 ∑ i = 0 n − 1 A i C n − i − 1 n ≥ 2 A_n=\begin{cases} 0 &amp; n=0 \\ 1 &amp; n=1 \\ 2\sum\limits_{i=0}^{n-1}A_iC_{n-i-1} &amp; n\ge2 \end{cases} An=012i=0n1AiCni1n=0n=1n2
C n = { 1 n = 0 ∑ i = 0 n − 1 C i C n − i − 1 n ≥ 1 C_n=\begin{cases} 1&amp;n=0 \\ \sum\limits_{i=0}^{n-1}C_iC_{n-i-1} &amp; n\ge1 \end{cases} Cn=1i=0n1CiCni1n=0n1

可得 β ( x ) = 1 + ∑ n = 1 ∞ C n x n = 1 + ∑ n = 1 ∞ x n ∑ i = 0 n − 1 C i C n − i − 1 = 1 + x ⋅ β 2 ( x ) \begin{array}{lll} \beta(x) &amp; = &amp; 1+\sum\limits_{n=1}^\infty C_nx^n \\ &amp; = &amp; 1+\sum\limits_{n=1}^\infty x^n\sum\limits_{i=0}^{n-1}C_iC_{n-i-1} \\ &amp; = &amp; 1+x\cdot\beta^2(x) \end{array} β(x)===1+n=1Cnxn1+n=1xni=0n1CiCni11+xβ2(x)

求根公式 x = − b ± Δ 2 a \bm{x=\frac{-b\pm\sqrt{\rm\Delta}}{2a}} x=2ab±Δ (好久没用都快忘了.jpg
解得 β ( x ) = 1 ± 1 − 4 x 2 x \bm{\beta(x)=\frac{1\pm\sqrt{1-4x}}{2x}} β(x)=2x1±14x

最后我们会取的是 β ( x ) = 1 − 1 − 4 x 2 x \bm{\beta(x)=\frac{1-\sqrt{1-4x}}{2x}} β(x)=2x114x 。因为这东西是卡特兰数的生成函数。
我们一般用到的卡特兰数是非负的,所以这么取。

并且
α ( x ) = x + ∑ n = 0 ∞ 2 x n ∑ i = 0 n − 1 A i C n − i − 1 = x + 2 x ⋅ α ( x ) β ( x ) = x + 2 x ⋅ α ( x ) ⋅ 1 − 1 − 4 x 2 x = x + α ( x ) − α ( x ) ⋅ 1 − 4 x \begin{array}{lll} \alpha(x) &amp; = &amp; x+\sum\limits_{n=0}^\infty2x^n\sum\limits_{i=0}^{n\bm-1}A_iC_{n\bm-i\bm-1} \\ &amp; = &amp; x+2x\cdot\alpha(x)\beta(x) \\ &amp; = &amp; x+2x\cdot\alpha(x)\cdot\frac{1\bm-\sqrt{1\bm-4x}}{2x} \\ &amp; = &amp; x+\alpha(x)\bm-\alpha(x)\cdot\sqrt{1\bm-4x} \end{array} α(x)====x+n=02xni=0n1AiCni1x+2xα(x)β(x)x+2xα(x)2x114x x+α(x)α(x)14x
那么
α ( x ) = x 1 − 4 x = x ( 1 − 4 x ) − 0.5 \begin{array}{lll} \alpha(x)&amp;=&amp;\frac{x}{\sqrt{1\bm-4x}}\\ &amp;=&amp;x(1\bm-4x)^{\bm -0.5} \end{array} α(x)==14x xx(14x)0.5

( 1 − 4 x ) − 0.5 (1\bm-4x)^{\bm -0.5} (14x)0.5 展开后第 n − 1 n-1 n1 项为
− 0.5 ( − 0.5 − 1 ) ⋯ [ − 0.5 − ( n − 1 ) + 1 ] ( n − 1 ) ! ⋅ ( − 4 x ) n − 1 = ( − 1 ) n − 1 ⋅ ∏ i = 1 n − 1 ( 2 i − 1 ) ( n − 1 ) ! 2 n − 1 ⋅ ( − 1 ) n − 1 ⋅ 4 n − 1 ⋅ x n − 1 \begin{array}{ll} &amp;\displaystyle{\frac{-0.5(-0.5-1)\cdots[-0.5-(n-1)+1]}{(n-1)!}}\cdot(-4x)^{n-1}\\ \displaystyle=&amp;\displaystyle\frac{(-1)^{n-1}\cdot\prod\limits_{i=1}^{n-1}(2i-1)}{(n-1)!2^{n-1}}\cdot(-1)^{n-1}\cdot4^{n-1}\cdot x^{n-1}\\ \end{array} =(n1)!0.5(0.51)[0.5(n1)+1](4x)n1(n1)!2n1(1)n1i=1n1(2i1)(1)n14n1xn1
继续化简系数。
( − 1 ) n − 1 ⋅ ∏ i = 1 n − 1 ( 2 i − 1 ) ( n − 1 ) ! 2 n − 1 ⋅ ( − 1 ) n − 1 ⋅ 4 n − 1 = ( 2 n − 3 ) ! ( n − 1 ) ! 2 n − 1 ∏ i = 1 n − 2 2 i ⋅ 4 n − 1 = ( 2 n − 3 ) ! ( n − 1 ) ! 2 n − 2 ( n − 2 ) ! ⋅ 2 n − 1 = 2 ( 2 n − 3 ) ! ( n − 1 ) ! ( n − 2 ) ! \begin{array}{ll} &amp;\displaystyle\frac{(-1)^{n-1}\cdot\prod\limits_{i=1}^{n-1}(2i-1)}{(n-1)!2^{n-1}}\cdot(-1)^{n-1}\cdot4^{n-1}\\ =&amp;\displaystyle\frac{(2n-3)!}{(n-1)!2^{n-1}\prod\limits_{i=1}^{n-2}2i}\cdot4^{n-1}\\ \displaystyle=&amp;\displaystyle\frac{(2n-3)!}{(n-1)!2^{n-2}(n-2)!}\cdot2^{n-1}\\ \displaystyle=&amp;\displaystyle\frac{2(2n-3)!}{(n-1)!(n-2)!} \end{array} ===(n1)!2n1(1)n1i=1n1(2i1)(1)n14n1(n1)!2n1i=1n22i(2n3)!4n1(n1)!2n2(n2)!(2n3)!2n1(n1)!(n2)!2(2n3)!

那么 α ( x ) \alpha(x) α(x) n n n 项系数就是 ( 1 − 4 x ) − 0.5 (1\bm-4x)^{\bm -0.5} (14x)0.5 的第 n − 1 n-1 n1 项系数。
2 ( 2 n − 3 ) ! ( n − 1 ) ! ( n − 2 ) ! \frac{2(2n-3)!}{(n-1)!(n-2)!} (n1)!(n2)!2(2n3)!
要求的期望是
2 ⋅ ( 2 n − 3 ) ! ( n − 1 ) ! ⋅ ( n − 2 ) ! ⋅ C n = 2 ⋅ ( 2 n − 3 ) ! ⋅ n ! ⋅ ( n + 1 ) ! ( n − 1 ) ! ⋅ ( n − 2 ) ! ⋅ ( 2 n ) ! = 2 ⋅ n ⋅ ( n − 1 ) ⋅ n ⋅ ( n + 1 ) ( 2 n − 2 ) ⋅ ( 2 n − 1 ) ⋅ ( 2 n ) = n ⋅ ( n + 1 ) 2 ⋅ ( 2 n − 1 ) = n ( n + 1 ) 4 n − 2 \begin{array}{lll} \displaystyle\frac{2\cdot(2n-3)!}{(n-1)!\cdot(n-2)!\cdot C_n}&amp;\displaystyle=&amp;\displaystyle\frac{2\cdot(2n-3)!\cdot n!\cdot(n+1)!}{(n-1)!\cdot(n-2)!\cdot(2n)!} \\ &amp;\displaystyle=&amp;\displaystyle\frac{2\cdot n\cdot (n-1)\cdot n\cdot (n+1)}{(2n-2)\cdot(2n-1)\cdot(2n)}\\ &amp;\displaystyle=&amp;\displaystyle\frac{n\cdot(n+1)}{2\cdot(2n-1)}\\ &amp;\displaystyle=&amp;\displaystyle\frac{n(n+1)}{4n-2} \end{array} (n1)!(n2)!Cn2(2n3)!====(n1)!(n2)!(2n)!2(2n3)!n!(n+1)!(2n2)(2n1)(2n)2n(n1)n(n+1)2(2n1)n(n+1)4n2n(n+1)
以上。当然最后也可以证 = n C n − 1 =nC_{n-1} =nCn1 那个结论啦。

另外前面也可以不展开,可以利用无穷级数逐项积分和逐项求导做。

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值