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\)个点的有标号二 ...
随机推荐
- 玩玩小程序:使用 WebApi 交互打造原生的微信小程序 - 图灵小书架
使用 WebApi 交互打造原生的微信小程序 - 图灵小书架 目录 介绍 源码地址 扫一扫体验 代码分析 其它相关信息(互联网搜集) 介绍 定时抓取图灵社区官网的首页.最热.推荐和最新等栏目的相关图书 ...
- 修改phpcms中的评论样式
phpcms中自带的评论插件很好用!但是样式个人感觉丑的狠,百度一下也没能找到解决方式,也许是自己的搜索方式不对,于是自己就研究了研究,这里可以使用两种方法进行修改 方法一: 使用PHPCMS中的ge ...
- Java学习点滴——Class和反射
基于<Java编程思想>第四版 前言 我们要操作一个类实例对象时,一般都要先知道这个类有哪些方法或者成员变量.反射就是在我们不知道这个类有哪些方法或成员变量时,使用特定方式得到类的这些信息 ...
- transform旋转,平移,缩放,扭曲 斜切
transform 改变rotate 旋转translate 位移scale 缩放 skew 斜切变形 记得兼容性:-webkit- -moz- -ms- -o- transf ...
- mssql sqlserver 分组排序函数row_number、rank、dense_rank用法简介及说明
在实际的项目开发中,我们经常使用分组函数,对组内数据进行群组后,然后进行组内排序:如:1:取出一个客户一段时间内,最大订单数的行记录2: 取出一个客户一段时间内,最后一次销售记录的行记录——————— ...
- windows10安装mysql-8.0.13(zip安装)
安装环境说明 系统版本:windows10 mysql版本:mysql-8.0.13-winx64.zip 下载地址:http://mirrors.163.com/mysql/Downloads/My ...
- python3 haproxy配置文件操作练习
哈哈 老规矩 先来一个NLP第六条:咳咳! 六,重复旧的做法,只会得到旧的结果 做法有不同,结果才会有不同. 如果,你的事没有结果,改变你的做法.任何新的做法,都比旧的多一份成功的机会. 想明天比 ...
- 关于nginx unit服务非正常关闭后,无法重新启动问题的处理
昨天在前领导技术大牛吕哥的帮忙下,python服务管理从nginx+supervisor+uwsgi+python3改为了轻便结构nginx + unit + python3,部署和配置起来顿时轻松起 ...
- 深入学习:Windows下Git新手教程(上)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/huangyabin001/article/details/35557231 一,安装Git: 1.1 ...
- SQL 查询中case的运用
适用场景: 需要根据现有字段经过一定条件得到新的查询字段相关语法: CASE WHEN 条件1 TEHN 结果1 WHEN 条件2 THEN 结果2 ...... ELSE 结果N END 练习代码: ...