51nod 1260 排列与二叉树

本文详细分析了51nod 1260题,涉及具有特定条件的二叉树及其与排列的关系。通过染色策略和最小表示法,探讨了不同排列的计数问题,并推导了生成函数及递推关系,提出使用广义二项式定理来O(n)计算特定项系数,解决实际问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意

考虑这样的二叉树:

  1. 每个内部节点同时有左儿子和右儿子
  2. 恰好有 n 个叶子

对任意满足上述条件的二叉树,我们按照中序遍历把每个叶子分别标上 1~n,接下来,你可以任意交换每个内部节点的左右子树。之后,中序遍历这棵树,把每个叶子的标号按照访问到它的时间写下来形成一个 1~n 的排列。

求所有这样的二叉树经过任意交换后可以得到的不同的排列的个数。

约定:n106

初步分析

考虑任意一个符合条件的二叉树,我们把它的每个内部节点染上黑白两色之一,然后交换所有黑色节点的左右子树,就可以得到一个符合条件的排列。

这样不会重复计数?

废话这样当然会重复计数。。。

考虑如果存在两个相邻的节点被染上同一种颜色(自行脑补吧……)那么你可以像旋转平衡树一样把它们转一下,得到一个形态不同的二叉树,对这个新的二叉树按照染色进行变换,可以得到一个和原树变换后相同的排列。

但是这些方案你总不能不计吧?

考虑最小表示法的思想,我们规定每个点不能和它的左儿子(如果有的话)染上同样的颜色,否则的话可以把树“右旋”一下使得两个颜色相同的点变成父亲-右儿子的形式。这样就可以不重不漏的计数了。

证明了吗?

关于这个做法我脑补了一个长而且麻烦的证法…太啰嗦了这里写不下(害怕是错的被hack)。不过事实证明这样的方法是 work 的。

那么初步分析就完成了,我们有已经大概的思路辣!

推导

考虑二叉树的 n1 个内部节点,显然只有那些左孩子为叶子的点可以自由染色,其他点的颜色已经被限制了(要求和左孩子颜色相反),设有 m 个点的左孩子为叶子,那么对这个树染色有 2m 种方案。

考虑把所有叶子节点剥去,那么可以自由染色的点就是所有没有左孩子的点,我们设hn表示有 n 个节点的各种形态的二叉树的不同染色方案的和

hn 的递推关系与生成函数:

首先边界条件为 h0=1

枚举根节点的左右子树大小,可以得到这样的关系式(注意没有左孩子时候根节点可以自由染色):

hn=i=1n1hihni1+2hn1=i=0n1hihni1+hn1

看着这个递推式就能让人想起Catalan数列。回忆一下,Catalan数的生成函数是怎么推的来着?

hn 的生成函数为 F(x),那么我们有:

(F2(x)+F(x))x+1=F(x)

解之,可得:

F(x)=1x±x26x+12x

考虑 x0时,应该有 F(x)1,所以分子上的 ‘±’ 应该取负号,即:

F(x)=1xx26x+12x

然后…然后我想了好久这个能不能快速算出前 n 项,想了好久的结论是:不可做我还太弱了不会,不过由于只有一组询问,所以我们用广义二项式定理把 (x26x+1)12 展开,暴力算出第 n 项还是很资瓷的!

O(n) 计算特定项系数

对于给定的询问 n,因为有 n1 个内部节点,所以应该算出来 F(x)xn1 的系数。

首先特判掉 n=1 的情况。

考虑因为分母上有个 x,所以我们应该算出 (x26x+1)12 的第 x(n1)+1 项系数,然后除以 2

对根号进行二项式展开:

(x26x+1)12=i=0(x26x)i(12i)

考虑展开之后每一项对 xn 的贡献,我们枚举乘了 ix2,那么有 n2ix 来自 6x,这一项来自 (x26x)ni ,不难计算它对答案的贡献为:

(6)n2i×(12ni)×(nii)

所以有:

ans=12i=0n2(6)n2i×(12ni)×(nii)

做完辣!最后这个式子真是简(hui)洁(se)优(nan)雅(dong)呀!

什么?你问我 (12ni) 怎么算?

答曰:暴力算:

(12k)=12×(12)××(12k+1)k!

按这个递推就行了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值