博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ.5305.[HAOI2018]苹果树(组合 计数)
阅读量:4479 次
发布时间:2019-06-08

本文共 1617 字,大约阅读时间需要 5 分钟。

BZOJ上除了0ms的Rank1啦。明明这题常数很好优化的。


首先,\(n=1\)时有\(2\)个位置放叶子,\(n=2\)时有\(3\)个... 可知\(n\)个点的有标号二叉树有\(n!\)种。(一个二叉树的中序遍历是唯一的,有\(n!\)种,也可以得到这个结论)

\(Sol1\)

考虑对每条边两边的点集计算贡献。即设一条边一边有\(size\)个点,另一边有\(n-size\)个点,那么它的贡献是\(size(n-size)\)
直接把边放到点上,枚举每个点\(i\)(边就是\(i\to fa[i]\)),再枚举\(size_i\)\(size_i\)就是\(i\)子树的大小。
考虑此时的方案数。\(i\)子树和\(i\)子树外是独立的。
对于\(i\)子树,有\(size_i!\)种树的形态,而标号分配有\(C_{n-i}^{size_i-1}\)种方案(\(i\)子树内点的编号要\(\geq i\))。所以\(i\)子树有\(size_i!\times C_{n-i}^{size_i-1}\)种。
对于\(i\)子树外部,首先构造出\(i\)个点的树有\(i!\)种方案。然后还有\(n-i-size_i+1\)个点需要放在\(i\)子树外的任意位置,方案数是\((i+1-2)(i+2-2)...(i+n-i-size_i+1-2)\)。两个乘起来,就是\(i(i-1)(n-size_i-1)!\)
那么答案就是\[\sum_{i=2}^n\sum_{size_i=1}^{n-i+1}size_i(n-size_i)size_i!\cdot C_{n-i}^{size_i-1}\cdot i(i-1)(n-size_i-1)!\]

\(Sol2\)

递推。考虑由枚举大小为\(L,R\)的两棵左右子树来得到\(L+R+1\)个点的树。那么知道深度就可以算两棵子树间的距离了。
\(f[i]\)表示\(i\)个节点的树,所有\(i!\)种可能中,所有点深度的和(根节点深度为\(1\))。
\(g[i]\)表示\(i\)个节点的树,所有\(i!\)种可能中,所有点两两之间的距离的和。
转移的时候枚举左右子树的大小\(L,R=i-L-1\),有\[\begin{aligned}f[i]&=i*i!+\sum_{L=0}^{i-1}C_{i-1}^L(f[L]*R!+f[R]*L!)\\g[i]&=\sum_{L=0}^{i-1}C_{i-1}^L(g[L]*R!+g[R]*L!+f[L]*R!*(R+1)+f[R]*L!*(L+1))\end{aligned}\]

这样\(g[n]\)就是答案啦。


//16540kb   196ms#include 
#define Mod(x) x>=mod&&(x-=mod)typedef long long LL;const int N=2005;const LL LIM=1ll<<61;int C[N][N],fac[N],g[N];int main(){ int n,mod; scanf("%d%d",&n,&mod); C[0][0]=fac[0]=fac[1]=1; for(int i=2; i<=n; ++i) fac[i]=1ll*i*fac[i-1]%mod; for(int i=1; i<=n; ++i) { C[i][0]=C[i][i]=1; for(int j=1; j
=LIM) ans%=mod; printf("%lld\n",ans%mod); return 0;}

转载于:https://www.cnblogs.com/SovietPower/p/10748148.html

你可能感兴趣的文章
scrapy安装
查看>>
vim常用操作
查看>>
IOS中设置cell的背景view和选中时的背景view 、设置cell最右边的指示器(比如箭头\文本标签)...
查看>>
ac自动机
查看>>
ruby的循环控制命令loop等
查看>>
多线程09-Mutex
查看>>
Ionic4.x 中的 UI 组件(UI Components) Slides 轮播图组件、Searchbar 组件、 Segment 组件
查看>>
ssh框架整合完整版
查看>>
Yii2——在模型(Model)中使用分页(Pagination)
查看>>
ServletConfig接口
查看>>
初识nginx\squid\nfs\tomcat
查看>>
P4752 Divided Prime
查看>>
[C#]C#学习笔记-CIL和动态程序集
查看>>
[Effective C# 4.0 译] 条款21:限定类型的可见性
查看>>
离散化
查看>>
leetcode 23. Merge k Sorted Lists(堆||分治法)
查看>>
用C++建立一个窗口
查看>>
第二百八十八天 how can I坚持
查看>>
在mac上安装ruby
查看>>
javascript 开发规范
查看>>