博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P4492 [HAOI2018]苹果树
阅读量:7227 次
发布时间:2019-06-29

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

除了神仙啥都不想说了orz->

首先生成二叉树的时候,第一个点有\(1\)种选法,第二个点有\(2\)种选法...第\(n\)个点有\(n\)种选法,于是树的形态共有\(n!\)种,需要求它们总共的点对距离和

发现按点来考虑太麻烦了,我们按边来考虑贡献,对\(i\)的父亲边来说,有\(sz_i(n-sz_i)\)个点对会经过这一条边,所以这一条边对答案就有这么多的贡献

于是考虑一下\(O(n^2)\)的枚举,设\(sz_i\)为子树的大小,\(i\)为当前点,那么这棵子树的形态有\(sz_i!\)种,子树的编号有\(C_{n-i}^{sz_i-1}\)种(生成\(i\)之后从剩下的点中选出\(sz_i-1\)个让他们在\(i\)的子树里),于是总的方案数就是\(sz_i!C_{n-i}^{sz_i-1}\)

然后考虑子树外的方案数,生成\(i\)之前共有\(i!\)种方法,而生成\(i\)之后的点不能放到\(i\)的子树中,于是后面的点有\((i+1-2),(i+2-2),...(n-sz_i+1-2)\)种方法(因为放到\(i\)的子树中的点并不会影响外面的点的方案数),乘起来化简一下就是\(i(i-1)(n-sz_i-1)!\)种方法

于是最后的答案就是\[ans=\sum_{i=2}^{n}\sum_{j=1}^{n-i+1}j(n-j)j!C_{n-i}^{j-1}i(i-1)(n-j-1)!\]

//minamoto#include
#define ll long longusing namespace std;const int N=2005;int n;ll mod,dp[N][N],C[N][N],fac[N],res;int main(){// freopen("testdata.in","r",stdin); scanf("%d%lld",&n,&mod),fac[0]=1; for(int i=0;i<=n;++i)C[i][i]=C[0][i]=1; for(int i=0;i<=n;++i)for(int j=1;j

转载于:https://www.cnblogs.com/bztMinamoto/p/9954040.html

你可能感兴趣的文章
lua学习例子
查看>>
研究:印度气候变暖速度加剧 2040年或面临重灾
查看>>
python爬虫——爬取豆瓣TOP250电影
查看>>
C++与Rust操作裸指针的比较
查看>>
了解webpack-4.0版本(一)
查看>>
如何培养良好的编程风格
查看>>
Netty Channel源码分析
查看>>
基于 HTML5 WebGL 的 3D 机房
查看>>
Java编程——数据库两大神器:索引和锁
查看>>
springMvc学习笔记(2)
查看>>
吐槽Javascript系列二:数组中的splice和slice方法
查看>>
什么是Javascript函数节流?
查看>>
MQ框架的比较
查看>>
oschina
查看>>
Octave 入门
查看>>
深度学习入门:10门免费线上课程推荐
查看>>
React组件设计模式(一)
查看>>
E-HPC支持多队列管理和自动伸缩
查看>>
express + mock 让前后台并行开发
查看>>
30天自制操作系统-2
查看>>