Luogu4492 [HAOI2018]苹果树 【动态规划】
题目分析:
思路不难想,考虑三个dp状态$f,g,d$。
$g[i]$表示有$i$个点的堆的数量
$d[i]$表示有$i$个点的情况下所有的方案数中点到根的距离和
$f[i]$表示要求的答案。
不难发现$g[i]=i!$,然后$d[i]$就枚举左子树大小,然后把左右子树单独的$d[j]$加起来,最后对于每种方案都加上$i-1$,也就是$d[i] = g[i]*(i-1)+\sum_{j=0}^{i-1}\binom{i-1}{j}*(d[j]*g[i-j-1]+d[i-j-1]*g[j])$。
然后考虑$f[i]$,也是考虑左子树大小然后递归处理$f[j]$,然后再通过$d[i]$处理出到根的距离和,最后再通过$d[i]$之间的乘法求出跨越两个子树的情况,具体看我代码。
代码:
#include<bits/stdc++.h>
using namespace std; const int maxn = ; int n,p;
int g[maxn],f[maxn],d[maxn];
int C[maxn][maxn]; void work(){
g[] = ; d[] = d[] = ;
for(int i=;i<=n;i++) g[i] = 1ll*g[i-]*i%p;
for(int i=;i<=n;i++){
for(int j=;j<i;j++){
int sub=1ll*C[i-][j]*((1ll*d[j]*g[i-j-]+1ll*d[i--j]*g[j])%p)%p;
d[i] += sub; d[i] %= p;
}
d[i] += 1ll*g[i]*(i-)%p; d[i] %= p;
}
f[] = ; f[] = ;
for(int i=;i<=n;i++){
for(int j=;j<i;j++){
int sub=1ll*C[i-][j]*(1ll*f[j]*g[i-j-]%p+1ll*f[i-j-]*g[j]%p)%p;
int lt=1ll*C[i-][j]*((d[j]+1ll*g[j]*j)%p)%p*g[i-j-]%p;
int rt=1ll*C[i-][j]*((d[i-j-]+1ll*g[i-j-]*(i-j-))%p)%p*g[j]%p;
int crs=1ll*lt*(i--j)%p,cts=1ll*rt*j%p;
f[i] += (1ll*sub+lt+rt+crs+cts)%p;
f[i] %= p;
}
}
printf("%d\n",f[n]);
} int main(){
scanf("%d%d",&n,&p);
if(p == ){puts("");return ;}
for(int i=;i<=n;i++){
C[i][] = C[i][i] = ;
for(int j=;j<i;j++){
C[i][j] = (C[i-][j] + C[i-][j-])%p;
}
}
work();
return ;
}
Luogu4492 [HAOI2018]苹果树 【动态规划】的更多相关文章
- 【BZOJ5305】[HAOI2018]苹果树(组合计数)
[BZOJ5305][HAOI2018]苹果树(组合计数) 题面 BZOJ 洛谷 题解 考虑对于每条边计算贡献.每条边的贡献是\(size*(n-size)\). 对于某个点\(u\),如果它有一棵大 ...
- [洛谷P4492] [HAOI2018]苹果树
洛谷题目链接:[HAOI2018]苹果树 题目背景 HAOI2018 Round2 第一题 题目描述 小 C 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 C ...
- [HAOI2018]苹果树(组合数学,计数)
[HAOI2018]苹果树 cx巨巨给我的大火题. 感觉这题和上次考试gcz讲的那道有标号树的形态(不记顺序)计数问题很类似. 考虑如果对每个点对它算有贡献的其他点很麻烦,不知怎么下手.这个时候就想到 ...
- BZOJ5305 HAOI2018苹果树(概率期望+动态规划)
每种父亲编号小于儿子编号的有标号二叉树的出现概率是相同的,问题相当于求所有n个点的此种树的所有结点两两距离之和. 设f[n]为答案,g[n]为所有此种树所有结点的深度之和,h[n]为此种树的个数. 枚 ...
- [BZOJ5305][Haoi2018]苹果树 组合数
题目描述 小 C 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 C 发现每一天这棵树都会生长出一个新的结点. 第一天的时候, 果树会长出一个根结点, 以后每一 ...
- [BZOJ5305][HAOI2018]苹果树 组合数学
链接 小 C 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 C 发现每一天这棵树都会生长出一个新的结点. 第一天的时候, 果树会长出一个根结点, 以后每一天, ...
- [BZOJ5305] [HAOI2018] 苹果树 数学 组合计数
Summary 题意很清楚: 小 \(C\) 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 \(C\) 发现每一天这棵树都会生长出一个新的结点. 第一天的时候 ...
- HAOI2018苹果树
题解 首先所有生成树的情况树是\(n!\)的,因为第一次有1中方法,第二次有两种放法,以此类推... 然后我们发现距离这种东西可以直接枚举每条边算贡献. 于是我们枚举了一个点\(i\),又枚举了这个点 ...
- BZOJ.5305.[HAOI2018]苹果树(组合 计数)
LOJ BZOJ 洛谷 BZOJ上除了0ms的Rank1啦.明明这题常数很好优化的. 首先,\(n=1\)时有\(2\)个位置放叶子,\(n=2\)时有\(3\)个... 可知\(n\)个点的有标号二 ...
随机推荐
- 从一个点子到一个社区APP,是如何通过.NET实现的?——“文林物业系统”APP介绍及采访记录
“文林物业系统”(简称“文林社区”)是一款与物业管理软件无缝衔接的移动端系统.可在线查看通知公告.报修.投诉建议.查询物业管理费.水电气等其他费用,并且支持在线缴费.以物业管理为接入点,在未来,将会致 ...
- ACCP8.0 HTML标签
ACCP8.0 HTML标签 第一章1.HTML超文本标记语言2.网页<html></html>3.网页头部<head></head>4.网页标题< ...
- 【转】Redis一般会遇到的问题以及解析
单线程的 Redis 为什么这么快 这个问题是对 Redis 内部机制的一个考察.根据我的面试经验,很多人都不知道Redis 是单线程工作模型.所以,这个问题还是应该要复习一下的. 回答主要是以下三点 ...
- Eclipse代码快捷键
今天终于找到了代码注释快捷键:ctrl+shift+/取消注释快捷键:ctrl+shift+\ Java文件:注释和取消注释的快捷键都是:CTRL + / 或 Shift+Ctrl+C JS文件:注释 ...
- 基于python的种子搜索网站-项目部署
本讲会对种子搜索网站的部署过程进行详细的讲解. 网站演示: https://bt.mypython.me 源码地址: https://github.com/geeeeeeeek/bt 项目部署过程 系 ...
- React-Native学习手册----搭建基于ios平台的开发环境
首先推荐几个链接: React-Native 官网地址:https://facebook.github.io/react-native/docs/getting-started React-Nativ ...
- webapi读取上传的文件流
逻辑说明 这里未引用System.Web.Mvc. 主要使用MultipartMemoryStreamProvider对象从Request中获取文件流. var provider = new Mult ...
- 从零开始制作 Hexo 主题
原文地址:从零开始制作 Hexo 主题 · Ahonn 写在前面 本文将会从零开始开发一个简单的博客主题.样式主要参考 Hexo theme 中的 Noise 主题. 开始之前你需要了解: 模板引擎 ...
- Mysql 字符串指定位置插入空格
UPDATE flow_data_243 SET data_15=CONCAT(LEFT(data_15,10),' ',RIGHT(data_15,LENGTH(data_15)-10)) WHER ...
- 机器学习:利用K-均值聚类算法对未标注数据分组——笔记
聚类: 聚类是一种无监督的学习,它将相似的对象归到同一个簇中.有点像全自动分类.聚类方法几乎可以应用于所有对象,簇内的对象越相似,聚类的效果越好.聚类分析试图将相似对象归入同一簇,将不相似对象归到不同 ...