BZOJ.5305.[HAOI2018]苹果树(组合 计数)
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]&=ii!+\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 <cstdio>
#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<i; ++j) C[i][j]=C[i-1][j-1]+C[i-1][j], Mod(C[i][j]);
}
for(int i=1; i<=n; ++i) g[i]=1ll*i*(n-i)*fac[n-i-1]%mod*fac[i]%mod;
LL ans=0;
for(int i=2; i<=n; ++i)
for(int sz=n-i+1,tmp=i*(i-1); sz; --sz)
if((ans+=1ll*C[n-i][sz-1]*g[sz]%mod*tmp)>=LIM) ans%=mod;
printf("%lld\n",ans%mod);
return 0;
}
BZOJ.5305.[HAOI2018]苹果树(组合 计数)的更多相关文章
- BZOJ 5305: [Haoi2018]苹果树 组合计数
一定要注意要乘阶乘,细节很多. code: #include <bits/stdc++.h> #define ll long long #define setIO(s) freopen(s ...
- luoguP4492 [HAOI2018]苹果树 组合计数 + dp
首先,每个二叉树对应着唯一的中序遍历,并且每个二叉树的概率是相同的 这十分的有用 考虑\(dp\)求解 令\(f_i\)表示\(i\)个节点的子树,根的深度为\(1\)时,所有点的期望深度之和(乘\( ...
- bzoj 5305: [Haoi2018]苹果树
Description Solution \(n\) 个点的二叉树的方案数是 \(n!\) 证明十分显然:新加入的点占掉了 \(1\) 个位置,新加了 \(2\) 个位置,那么多出来一个位置,所以第 ...
- [HAOI2018]苹果树(组合数学,计数)
[HAOI2018]苹果树 cx巨巨给我的大火题. 感觉这题和上次考试gcz讲的那道有标号树的形态(不记顺序)计数问题很类似. 考虑如果对每个点对它算有贡献的其他点很麻烦,不知怎么下手.这个时候就想到 ...
- 【BZOJ5305】[HAOI2018]苹果树(组合计数)
[BZOJ5305][HAOI2018]苹果树(组合计数) 题面 BZOJ 洛谷 题解 考虑对于每条边计算贡献.每条边的贡献是\(size*(n-size)\). 对于某个点\(u\),如果它有一棵大 ...
- bzoj 2281 [Sdoi2011]黑白棋(博弈+组合计数)
黑白棋(game) [问题描述] 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色 ...
- BZOJ 4555: [Tjoi2016&Heoi2016]求和 [分治FFT 组合计数 | 多项式求逆]
4555: [Tjoi2016&Heoi2016]求和 题意:求\[ \sum_{i=0}^n \sum_{j=0}^i S(i,j)\cdot 2^j\cdot j! \\ S是第二类斯特林 ...
- BZOJ 4555: [Tjoi2016&Heoi2016]求和 [FFT 组合计数 容斥原理]
4555: [Tjoi2016&Heoi2016]求和 题意:求\[ \sum_{i=0}^n \sum_{j=0}^i S(i,j)\cdot 2^j\cdot j! \\ S是第二类斯特林 ...
- bzoj 1004 Cards 组合计数
这道题考察的是组合计数(用Burnside,当然也可以认为是Polya的变形,毕竟Polya是Burnside推导出来的). 这一类问题的本质是计算置换群(A,P)中不动点个数!(所谓不动点,是一个二 ...
随机推荐
- arcgis图层 GraphicsLayer与FeatureLayer
什么是图层 图层是用来在 ArcGIS 产品套件中显示地理数据集的机制.每个图层代表一种数据集(可以是地图服务.图形或是矢量数据),并指定该数据集是如何描绘使用一组属性的. 包含一个地图控件的每个应用 ...
- full join no满连接的使用
查询各个部门工资范围,按照1000~2000,2000~3000....这样的格式显示人数 select * from (select job,count(*) as "1000~2000& ...
- Flask 之东方不败一
1,flask的初始 flask是Python的一个轻量级的web框架,相当于django而言. 知识点Python 三大主流web框架的对比 1.Django 主要特点是大而全,集成了很多组件,例如 ...
- 【摘】Oracle 11g EM安全证书问题无法访问的解决办法
本文摘自:http://www.cnblogs.com/wenlong/p/5255673.html 感谢攻城师10946无私分享 OS: Windows7 x64 Oracle: 11g R2 x ...
- springboot中使用kindeditor富文本编辑器实现博客功能
kindeditor在之前已经用过,现在在springboot项目中使用.并且也在里面使用了图片上传以及回显等功能. 其实主要的功能是图片的处理:kindeditor对输入的内容会作为html标签处理 ...
- MySQL对以特定名字开头的数据库进行授权
对以"db_1"开头的数据库进行授权 grant all privileges on `db_1%`.* to dp_admin identified by 'password'; ...
- 龙芯yl8089无声音的解决方案
网上搜索到的解决方法都是卸载pulseaudio,但这种方法比较暴力不能从根本上解决问题. 经过一段时间的排查,我发现最终问题出现在resample-method上. 由于内核内CS5536 AC97 ...
- springboot动态多数据源
参考文章:https://www.cnblogs.com/hehehaha/p/6147096.html 前言 目标是springboot工程支持多个MySQL数据源,在代码层面上,同一个SQL(Ma ...
- layui table 内容为select隐藏问题
<style> .layui-table-cell,.layui-form,.layui-table-box,.layui-table-body{ overflow: visible; } ...
- 初学python之路-day10
基础部分先告一段落,今天开始学习函数. 一.函数:完成 特定 功能的代码块,作为一个整体,对其进行特定的命名,该名字就代表函数 -- 现实中:很多问题要通过一些工具进行处理 => ...