题目分析:

思路不难想,考虑三个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]苹果树 【动态规划】的更多相关文章

  1. 【BZOJ5305】[HAOI2018]苹果树(组合计数)

    [BZOJ5305][HAOI2018]苹果树(组合计数) 题面 BZOJ 洛谷 题解 考虑对于每条边计算贡献.每条边的贡献是\(size*(n-size)\). 对于某个点\(u\),如果它有一棵大 ...

  2. [洛谷P4492] [HAOI2018]苹果树

    洛谷题目链接:[HAOI2018]苹果树 题目背景 HAOI2018 Round2 第一题 题目描述 小 C 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 C ...

  3. [HAOI2018]苹果树(组合数学,计数)

    [HAOI2018]苹果树 cx巨巨给我的大火题. 感觉这题和上次考试gcz讲的那道有标号树的形态(不记顺序)计数问题很类似. 考虑如果对每个点对它算有贡献的其他点很麻烦,不知怎么下手.这个时候就想到 ...

  4. BZOJ5305 HAOI2018苹果树(概率期望+动态规划)

    每种父亲编号小于儿子编号的有标号二叉树的出现概率是相同的,问题相当于求所有n个点的此种树的所有结点两两距离之和. 设f[n]为答案,g[n]为所有此种树所有结点的深度之和,h[n]为此种树的个数. 枚 ...

  5. [BZOJ5305][Haoi2018]苹果树 组合数

    题目描述 小 C 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 C 发现每一天这棵树都会生长出一个新的结点. 第一天的时候, 果树会长出一个根结点, 以后每一 ...

  6. [BZOJ5305][HAOI2018]苹果树 组合数学

    链接 小 C 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 C 发现每一天这棵树都会生长出一个新的结点. 第一天的时候, 果树会长出一个根结点, 以后每一天, ...

  7. [BZOJ5305] [HAOI2018] 苹果树 数学 组合计数

    Summary 题意很清楚: 小 \(C\) 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 \(C\) 发现每一天这棵树都会生长出一个新的结点. 第一天的时候 ...

  8. HAOI2018苹果树

    题解 首先所有生成树的情况树是\(n!\)的,因为第一次有1中方法,第二次有两种放法,以此类推... 然后我们发现距离这种东西可以直接枚举每条边算贡献. 于是我们枚举了一个点\(i\),又枚举了这个点 ...

  9. BZOJ.5305.[HAOI2018]苹果树(组合 计数)

    LOJ BZOJ 洛谷 BZOJ上除了0ms的Rank1啦.明明这题常数很好优化的. 首先,\(n=1\)时有\(2\)个位置放叶子,\(n=2\)时有\(3\)个... 可知\(n\)个点的有标号二 ...

随机推荐

  1. 第一册:lesson 115.

    原文:Knock,Knock! question:What does Jim have to drink? Isn't there anyone at home? I'll knock again , ...

  2. 用bat批处理程序通过DOS命令行删除所有的空文件夹

    用过gothub或者码云的同学都知道,不包含任何文件的空文件夹上传提交时不被允许的.当然你可以在空文件下创建.keep文件(或.gitkeep文件),然后就可以上传了. 但是如果空文件夹比较多,并且我 ...

  3. K2开发中,遇到用户无权限OPEN当前的待办

    1.用户有的时候在做操作时,提示用户没有权限OPEN当前流程,需要注意判断当前用户是K2标签还是K2SQL标签.如果标签不对,会导致当前问题的发生 后续如果再有碰到,再补充吧

  4. Spring Boot 自定义 starter

    一.简介 SpringBoot 最强大的功能就是把我们常用的场景抽取成了一个个starter(场景启动器),我们通过引入springboot 为我提供的这些场景启动器,我们再进行少量的配置就能使用相应 ...

  5. 零基础学Python--------第11章 使用Python操作数据库

    第11章 使用Python操作数据库 11.1 数据库编程接口 在项目开发中,数据库应用必不可少.虽然数据库的种类有很多,如SQLite.MySQL.Oracle等,但是它们的功能基本都是一样的,为了 ...

  6. java的设计模式 - Builder模式

    Builder 模式的目的? 构造对象的方式过于复杂,不如将之抽离出来.比如,构造器参数过多 这样说也有点抽象,举个例子吧. 举个例子 比如 非常热门的消息队列RabbitMQ 的 AMQP.Basi ...

  7. Nginx日志常用统计分析命令

    IP相关统计 统计IP访问量(独立ip访问数量) awk '{print $1}' access.log | sort -n | uniq | wc -l 查看某一时间段的IP访问量(4-5点) gr ...

  8. springmvc流程图

  9. mssql2008 r2 修改默认端口

    1.点击“开始”-“所有程序”-“Microsoft SQL Server 2008R2”-“配置工具”-“SQL Server配置管理器” 2.在打开的“SQL Server配置管理器”窗口中,在左 ...

  10. asp.net的Request.ServerVariables参数说明

    Request.ServerVariables["SERVER_NAME"] '获取服务器IPRequest.ServerVariables["HTTP_REFERER& ...