题解:qoj8047 DFS Order 4

news/2025/11/8 19:44:56/文章来源:https://www.cnblogs.com/LUlululu1616/p/19202941

题意:给出 \(n,P\),现在问对于所有 \(n\) 个点且父亲编号小于儿子的树,对其进行 dfs 并且优先遍历编号小的子节点,问有多少种 dfs 序。对 \(P\) 取模。\(n\le 800\)

做法:

首先考虑如何判定一种 dfs 序是否合法。考虑一个贪心策略,我维护一个深搜栈,考虑加入一个点 \(u\),为了保证父亲和已经遍历的兄弟小于 \(u\),从栈顶轮流弹直到弹出了一个比 \(u\) 小的数。如果弹完了就无解。

这样我们就用一个 dfs 序对应了唯一一颗树。

但是用这个贪心过程做 dp 不是很方便,原因是我们需要记录一条链的节点编号才行。我们考虑用这个贪心去刻画这样的树的性质。

我们考虑有小于关系的我们就连一条从小指向大的边,那么会转化成每个节点向自己的第一个儿子连一条边,然后兄弟之间前一个向后一个连边,如下图:

会改成:

但是这样还不够。我们注意到,如果一个儿子 \(u\) 他的最大儿子为 \(x\),满足对于他的下一个兄弟的编号 \(v\)\(x<v\),那么我们就可以把 \(v\) 放到 \(u\) 下变成 \(x\) 的兄弟,所以我们还会有这样的边:

发现一个问题,原本我们的有向边是一个外向树结构,加入这些红边之后就变成 dag 就完蛋了,所以我们考虑容斥,容斥成没有限制减去逆向。注意到逆向了之后就可以把 \((u,v)\) 间的这条边给直接扔掉,还是一颗树。

因为外向树的拓扑序是 \(\frac{n!}{\prod sz_u}\),我们先把 \(n!\) 提出来。

考虑 dp 去算这个 \(\frac{1}{sz}\) 的乘积之和,首先肯定要有一个代表 \(u\) 的子树大小。注意到最后一个儿子并没有一条向上的边不太一样,所以我们还需要记录最后一个儿子的子树大小。

\(dp_{i,j}\) 代表我有一个 \(u\) 为根的 \(i\) 大的子树,同时还另外有一个 \(j\) 大的儿子要并到 \(u\) 的儿子里。因为 \(i\) 还有可能在父亲的位置并上来一个子树,所以我们先不考虑 \(i\) 这里 \(\frac{1}{i}\) 的贡献。

考虑枚举子树中第一个儿子,讨论:

  • 如果只有一个儿子,那么 \(dp_{i,j}\leftarrow \frac{1}{i+j-1}dp_{i-1,0}\)。因为我考虑 \(u\rightarrow v\) 这里分别是 \(i-1,j\) 的大小,再加上一个根,所以状态是这样,同时有 \(\frac{1}{i+j-1}\)系数。

  • 否则考虑枚举这个儿子的大小为 \(k\),那么 \(dp_{i,j}\leftarrow \frac{1}{i+j-1}\sum\limits_{k=2}^{i-2}dp_{i-k,j}\times (dp_{k, 0}-dp_{k,i-1-k+j})\),首先 \(dp_{i-k,j}\) 就是我后面的儿子的贡献,然后这个做差就是考虑容斥,第一个是不并,第二个是并上来 \(u\) 后面的兄弟和 \(j\),所以是 \(i-1-k+j\) 的大小。

最后记得答案是 \(\frac{1}n dp_{n,0}n!\)

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 805;
int n, mod, dp[maxn][maxn], inv[maxn];
void prepare() {inv[0] = inv[1] = 1;for (int i = 2; i <= n; i++)inv[i] = (mod - mod / i) * inv[mod % i] % mod;
}
signed main() {cin >> n >> mod;dp[1][0] = 1;prepare();for (int i = 2; i <= n; i++) {for (int j = 0; j <= n - i; j++) {int res = dp[i - 1][0];for (int k = 2; k <= i - 2; k++)res = (res + (dp[k][0] - dp[k][i - 1 - k + j] + mod) % mod * dp[i - k][j] % mod) % mod;dp[i][j] = res * inv[i + j - 1] % mod;}}dp[n][0] = dp[n][0] * inv[n] % mod;for (int i = 1; i <= n; i++)dp[n][0] = dp[n][0] * i % mod;cout << dp[n][0] << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/959947.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

题解:qoj8047 DFS Order 4

题意:给出 \(n,P\),现在问对于所有 \(n\) 个点且父亲编号小于儿子的树,对其进行 dfs 并且优先遍历编号小的子节点,问有多少种 dfs 序。对 \(P\) 取模。\(n\le 800\)。 做法: 首先考虑如何判定一种 dfs 序是否合法…

Oracle数据库恢复检查脚本

Oracle数据库恢复检查脚本prompt +----------------------------------------------------------------------------+ prompt | Oracle Database Recovery Check Result | promp…

视野修炼-技术周刊第126期 | TypeScript #1

① 🤫spoilerjs ② 🏆 TypeScript 跃升至 \#1 - GitHub 上最常用的语言 ③ 中国法定假日查询库 ④ type-flag - 类型化命令行参数解析 ⑤ Node v24 已经是最新的LTS 版本 ⑥ TypingSVG ⑦ 腾讯 TDesign 组件库的 u…

详细介绍:FPGA 中的 AXI 总线介绍

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

深入解析:眼控交互:ErgoLAB新一代人机交互方式

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

大模型、智能体和MCP服务间的交互

大模型、智能体和MCP服务间的交互本文以从图书馆借书为例大模型LLM提供智能决策,基于权限结果智能体Agent协调流程,不包含业务逻辑图书馆MCP服务处理业务权限验证(能做什么)认证服务处理基础身份验证(谁),非MCP…

2025年国内成人自考机构口碑推荐排行榜单:权威解析与选择指南

摘要 2025年国内成人自考教育行业迎来新一轮发展机遇,随着终身学习理念的普及和职业晋升需求的增长,成人自考市场规模持续扩大。本文基于权威数据分析和用户口碑评价,为您呈现最新成人自考机构排行榜单,并提供详细…

大信息领域列式存储与云存储的融合发展

大信息领域列式存储与云存储的融合发展pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mon…

2025年六安市成人自考机构口碑推荐排行榜

摘要 2025年,成人自考教育行业迎来快速发展,在职人士对学历提升需求激增。本文基于权威数据和用户口碑,综合评估国内成人自考机构,推出前十排名榜单,并提供详细比较表单,助您高效选择可靠机构。榜单重点突出服务…

分享一个Oracle 数据库信息收集脚本

分享一个Oracle 数据库信息收集脚本LINUX: #!/bin/sh ############################################################################## # 脚本名称:oracle_db_info_collector.sh # 脚本版本:V3.0 # 功能描述:Or…

2025年11月杭州集训记

前面的区域,以后再来探索吧。

Bash 入门指南-简介和常见命令

Bash 入门指南-简介和常见命令Bash 入门指南(第一部分):Bash 简介 概述 Bash(Bourne Again Shell)是目前 Unix 和 Linux 系统中最广泛使用的命令行解释器,也是绝大多数 Linux 发行版的默认 Shell。作为用户与操作…

最小多项式与线性递推

对角化 在众多 dp 问题中,我们经常可以用矩阵快速幂进行优化。更进一步地,如果这个递推矩阵是一个形如 \(A = \begin{pmatrix} 3 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 9 \end{pmatrix}\),矩阵…

Zabbix服务告警:More than 75% used in the configuration cache

Zabbix Server 在运行时,会将主机、监控项、触发器、模板等配置信息从数据库加载到内存中,以加快访问速度。这块内存区域就叫 配置缓(Configuration Cache)。该值可通过配置文件CacheSize进行调整。问题现象 随着监…

to kill a mocking bird

this book describe a English hero again but actually power is shared by people with violence not the mercy from the conscience. History tells us that humans live in Stockholm.

mounriver studio WINDOWS启动报错解决

mounriver studio WINDOWS启动报错解决解决方法卸载软件, 然后重新安装,安装完成之后不要选择启动软件。安装界面关闭之后,使用管理员权限打开软件,便不会报错

Linux 内核启动日志输出阶段分析

问题描述 在对比原理图后,发现打印日志的串口是UART2(GPIO3_A2 & GPIO3_A3),但设备树中只开启了UART0(GPIO1_C2&GPIO1_C3)/* 以下设备树内容来自多个设备树描述文件*/ &uart0 {pinctrl-names = "de…

flask: 封装返回json的统一格式

一,函数 from flask import jsonifydef success_response(data=None):"""结果响应:带数据和状态信息"""return jsonify({status: "success",code: 200,msg: "",d…

使用 Flask 构建本机 PyTorch 模型部署:从服务端搭建到客户端调用

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Python 潮流周刊#126:新一代静态网站生成器

本周刊由 Python猫 出品,精心筛选国内外的 400+ 信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进 Python 技术,并增长职业和副业的收入。 温馨提…