【YBT2023寒假Day12 C】树的计数 II(prufer)(结论)(数学)

news/2024/4/19 10:17:56/文章来源:https://blog.csdn.net/weixin_43346722/article/details/129157162

树的计数 II

题目链接:YBT2023寒假Day12 C

题目大意

给你一个长度为 n 的排列 p,问你有多少个不同的有标号无根树,满足如果 i,j 有边那 pi,pj 也有边。

思路

首先可以把排列变成置换环。
注意到是树,发现一个置换中似乎不太可能内部连边,因为很可能会出现环,但显然是有情况可以的。
考虑讨论:
首先大小 111 不需要也就是可以,大小为 222 可以。
然后发现,一个环你表示成 a1,a2,...,aka_1,a_2,...,a_ka1,a2,...,ak,会发现你连 a1,axa_1,a_xa1,ax 至少长度大于 222 都不行。
如果 x≠k/2+1x\neq k/2+1x=k/2+1,那往后推进,就变成了 ax,a2x−1a_x,a_{2x-1}ax,a2x1,再由不等式有着肯定不是 a1a_1a1,那就跳到了一个新的点,那每次都会跳到一个跟之前不一样的点,而且不会停下来,那一定就是成了环而且点的个数大于 222,所以肯定不是树。
然后如果 x=k/2+1x=k/2+1x=k/2+1,会发现变成了 k/2k/2k/2 个连通块,它们内部无法合并,如果要跟外部连就会每个连通块都连出去两条边,一定会变成环,所以也不行。

那简单总结一下就是内部连边只有 k=1/2k=1/2k=1/2 的时候才行。


然后你似乎要考虑一个环是选内部连边还是外部连边。
但是当你内部连边多个的时候,你会发现好像不能把它们连起来。
不过准确来说 111 不许要内部连边,所以 111 可以外部连,但是你 222 似乎不能和另一个 222 内部连边在弄到一起,222 也不能内部连边之后跟 111 连到一起。

也就是说又有了一个结论:
至多只能选一个大小为 222 的环内部连边,而当有大小为 111 的环存在时,不会有内部连边。


接下来考虑外部连边,考虑两个环大小为 x,yx,yx,y 能不能连。
思考一下会发现当我们设 x⩽yx\leqslant yxy 的时候,条件是 x∣yx|yxy
那当 x∣yx|yxy 的时候,显然是可以连边形成 xxx 个连通块的。
那我们考虑证明 x∤yx\nmid yxy 的时候会出现环:
那如果有边 (a0,b0)(a_0,b_0)(a0,b0),就会有 (a0,bx),(aymodx,b0),(aymodx,bx)(a_0,b_x),(a_{y\bmod x},b_0),(a_{y\bmod x},b_x)(a0,bx),(aymodx,b0),(aymodx,bx)
那这四条边就成环了。
所以能连边的条件就是 x∣yx|yxy
那因为有编号,所以还有连边方式,显然连了一个之后后面都确定,那你就可以让一开始那个点最后在哪个连通块,所以是 xxx 个方案。


考虑怎么拼起来:
会发现如果 x<yx<yx<y 的时候,x,yx,yx,y 之间的连边可以说是单向的。
但是 x=yx=yx=y 的时候也可以连边,但是这个是双向的。
那你考虑处理 x=yx=yx=y 的,具体而言就是当有 nxn_xnx 个大小为 xxx 的,我们先算出把它组合成无根树森林的情况,再补上它们接到之前的树上的方案。
那组合成无根树森林,我们可以用 prufer 来搞(弄一个 000 号虚拟点)

但是你会发现接入到原来树中每个位置是取决于你接入的位置的。
考虑把 prufer 变形,考虑 prufer 序列怎么来的:
每次找到编号最大 / 最小的叶子,记录连着它的点,把这个叶子删去直到剩下两个点。
那记录连着它的点这个时候,我们就要乘上这个点代表的大小。
那就原本是贡献 111,现在是贡献 xxx,那我们可以把每个可以贡献的位置 xxx,让它贡献 cntx∗xcnt_x*xcntxx 而不是 cntxcnt_xcntx
那在这里就全是 cntx∗xcnt_x*xcntxx
然后至于 000 号虚拟点,那你可以理解为连向它就是连向之前树中可以连的任意一个,那任意一个都会产生各自的贡献,那你就把每个可以的位置的 cntx∗xcnt_x*xcntxx 加起来即可(记为 sumsumsum)。

不过我们 000 号点是虚拟的,那我们每次选编号大的最后就可以剩下 000 号点。


不过有一个特别特殊的地方是你最后的两条边之间的方案也要记得乘上,那在这里就是 sumsumsum(因为这两个点其中一个一定是 000


然后按着做的就完事了。

代码

#include<cstdio>
#define ll long long
#define mo 998244353using namespace std;const int N = 5e5 + 1000;
int n, a[N], sz[N], tot;
bool in[N];int dfs(int now) {if (in[now]) return 0;in[now] = 1; return 1 + dfs(a[now]);
}ll ksm(ll x, ll y) {ll re = 1; x %= mo;while (y) {if (y & 1) re = re * x % mo;x = x * x % mo; y >>= 1;}return re;
}ll Prufer(int n) {if (n == 1) return 1;return ksm(n, n - 2);
}void slove() {scanf("%d", &n);for (int i = 1; i <= n; i++) scanf("%d", &a[i]);for (int i = 1; i <= n; i++) {if (in[i]) continue;sz[dfs(i)]++;}ll ans = 0, cnt = 0;if (sz[1]) {ans = Prufer(sz[1]);cnt = sz[1];if (sz[2]) {ll num = cnt;(ans *= num * ksm(2 * sz[2] + num, sz[2] + 1 - 2) % mo) %= mo;cnt += sz[2];}}else if (sz[2]) {if (sz[2] == 1) ans = 1;else ans = 2 * ksm(2 * sz[2], sz[2] - 2) * sz[2] % mo;cnt += sz[2];}for (int i = 3; i <= n; i++) {if (!sz[i]) continue;ll num = 0;for (int j = 1; j * j <= i; j++) if (i % j == 0) {(num += 1ll * j * sz[j] % mo) %= mo;//接口*接这个接口的方案if (i / j != j && i / j != i) (num += 1ll * (i / j) * sz[i / j] % mo) %= mo;}(ans *= num * ksm(i * sz[i] + num, sz[i] + 1 - 2) % mo) %= mo;cnt += sz[i];}printf("%lld\n", ans);for (int i = 1; i <= n; i++) in[i] = 0, sz[i] = 0;tot = 0;
}int main() {freopen("count.in", "r", stdin);freopen("count.out", "w", stdout);int T; scanf("%d", &T);while (T--) slove();return 0;
}

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

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

相关文章

如何使用 ESP-PROG 板的 Program 接口为 ESP32-S3-WROOM-1 系列的模组烧录固件?

ESP-PROG 是一款乐鑫推出的开发调试工具&#xff0c;具有自动下载固件、串口通信、JTAG 在线调试等功能。具体使用说明参见&#xff1a;ESP-Prog 下载与调试板介绍 。 ESP-Prog 采用 FTDI 公司的 FT2232HL 为 USB Bridge Controller 芯片&#xff0c;可通过配置将 USB 2.0 接口…

分布式链路追踪-skywalking

一、分布式调用链随着业务的高速发展&#xff0c;服务之间的调用关系愈加复杂线上每一个请求会经过多个业务系统&#xff0c;并产生对各种缓存或者DB 的访问&#xff0c;业务流会经过很多个微服务的处理和传递。问题&#xff1a;• —次请求的流量从哪个服务而来&#xff1f;最…

在CentOS-7.9配置vsftpd服务

文章目录一 vsftpd简介二 环境准备三 服务部署3.1 安装软件3.2 编写配置文件3.3 用户授权3.4 启动服务3.5 文件传输测试3.5.1 Windows到Linux3.5.2 filezilla3.5.3 从Linux到Linux一 vsftpd简介 FTP是 File Transfer Protocol 文件传输协议的简称。 VSFTP是 Very Security FTP…

ESP32-C3 BLE5.0 扩展蓝牙名称长度的流程

蓝牙设备名称长度受限于蓝牙广播数据包的长度&#xff0c;如果广播数据包的长度不能包含完整的设备名称&#xff0c;则只显示短名称&#xff0c;其余不能容纳的部分将被截断。ESP32-C3 支持 BLE5.0&#xff0c;最大广播包长支持 1650 字节&#xff0c;可通过 esp_ble_gap_confi…

PTA L1-054 福到了(详解)

前言&#xff1a;内容包括&#xff1a;题目&#xff0c;代码实现&#xff0c;大致思路&#xff0c;代码解读 题目&#xff1a; “福”字倒着贴&#xff0c;寓意“福到”。不论到底算不算民俗&#xff0c;本题且请你编写程序&#xff0c;把各种汉字倒过来输出。这里要处理的每…

【python】argparse 模块的使用、Pycharm中使用argparse

目录1、简介2、使用步骤1&#xff09;导入argparse模块&#xff0c;并创建解释器2&#xff09;添加所需参数3&#xff09;解析参数3、使用 pycharm 传递参数给 argparse1、简介 argparse 模块是 Python 标准库中提供的一个命令行解析模块&#xff0c;它可以让使用者以类似 Uni…

编程题(二)

一、N皇后 II n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回 n 皇后问题 不同的解决方案的数量。 示例 1&#xff1a; 输入&#xff1a;n 4 输出&#xff1a;2 解释&#xff1a;如…

C#使用MQTT通信 .Net实现MQTT通信 java使用MQTT通信 java实现MQTT通信

MQTT是一种轻量级、基于发布/订阅模式的通信协议&#xff0c;通常用于物联网设备间的通信。MQTT协议采用简单的二进制消息格式&#xff0c;能够在不占用过多网络带宽的情况下进行高效的通信。以下是使用MQTT进行通信的一些基本概念&#xff1a;BrokerMQTT通信中的中间件&#x…

一文速学数模-集成预测模型Boost(提升方法)原理以及框架+模型速览

目录 前言 一、Boosting算法起源 强学习 弱学习 二、Boosting算法核心思想 举例案例 类推 三、Boosting算法框架 四、Boosting算法种类 AdaBoost GBDT XGBoost LighGBM 1.数据划分 2.直方图梯度提升决策树&#xff08;Histogram-based Gradient Boosting Decisio…

一、线程的基本概念

文章目录基础概念线程与进程什么是进程&#xff1f;什么是线程&#xff1f;进程和线程的区别&#xff1a;多线程什么是多线程&#xff1f;多线程的局限性串行、并行、并发同步异步、阻塞非阻塞线程的创建1、继承Thread类&#xff0c;重写run方法2、实现Runnable接口&#xff0c…

软件质量测试中的健壮性测试是什么?一文和你说

当大多数人开车时&#xff0c;他们不会担心刹车失灵。当他们的孩子得到一个新玩具时&#xff0c;他们也不担心因故障受伤。事实上&#xff0c;大多数人在日常生活中根本不担心系统故障。 这是因为软件开发人员或质量控制工程师已经解决了质量问题。如果目标是交付高质量、可靠…

Win11安装软件报缺失.NET的解决方法

1.问题描述&#xff1a;安装软件时提示这个 2.解决方法&#xff1a; WinR 打开运行界面&#xff0c;输入control回车&#xff0c;打开控制面板 点击打开程序和功能 选择 启用或关闭Windows功能 --》勾选.NET Framework3.5...这一项&#xff0c;点击确定&#xff0c;如果电脑上…

学习Flask之五、数据库

学习Flask之五、数据库 数据库有组织的存贮应用数据。根据需要应用发布查询追踪特定部分。网络应用最常用的数据库是基于关系模式的&#xff0c;也称为SQL数据库&#xff0c;引用结构化查询语句。但是近年来&#xff0c;面向文档和键值的数据库&#xff0c;非正式的统称为NoSQ…

一文教你玩转 Apache Doris 分区分桶新功能|新版本揭秘

数据分片&#xff08;Sharding&#xff09;是分布式数据库分而治之 (Divide And Conquer) 这一设计思想的体现。过去的单机数据库在大数据量下往往面临存储和 IO 的限制&#xff0c;而分布式数据库则通过数据划分的规则&#xff0c;将数据打散分布至不同的机器或节点上&#xf…

全局组件和局部组件

全局组件第一种定义方法&#xff1a;A、创建自己的组件&#xff1a;Loading.vueB、在main.js文件中引入组件并注册import Vue from vue import App from ./App.vue import * as filters from ./filterimport quanjuzujian from ./components/quanjuzujian.vueVue.component(qua…

PowerJob容器的今生,容器是如何部署到Worker上,并正常运行的

这仅仅是一篇PowerJob源码分析的文章&#xff0c;但是也有一些java基础知识&#xff0c;在实践中学习效果更好&#xff0c;感兴趣就留下来交流一下吧。 上回书说到&#xff0c;这个powerjob容器是如何生成模板&#xff0c;如何上传到服务器上去&#xff0c;本回主要总结的是&am…

【踩坑指南】Stable Diffusion 服务器端部署笔记

文章目录下载github文件配置环境ckpt文件权重下载生成图像NSFW检查&#xff08;瑟图过滤&#xff09;下载github文件 https://github.com/CompVis/stable-diffusion 这个网址&#xff0c;下载压缩包解压&#xff0c;也可以用git clone下载 配置环境 这一步坑最多&#xff0c…

day32 多线程(上)

文章目录相关概念codeThreadTest01ThreadTest02 编写一个类&#xff0c;直接继承java.lang.Thread&#xff0c;重写run方法ThreadTest03 实现线程的第二种方法ThreadTest04 采用匿名内部类的方式ThreadTest05 获取线程名字ThreadTest06 sleep方法sleep面试题ThreadTest08 终止线…

游戏专用蓝牙耳机哪个牌子好?最好的游戏蓝牙耳机品牌排行

近年来&#xff0c;随着越来越多手机取消3.5mm耳机孔&#xff0c;真无线耳机也逐渐流行起来&#xff0c;随着国内的手机品牌越来越多&#xff0c;真无线耳机的品类逐渐增多&#xff0c;面向游戏用户的游戏模式也出现了&#xff0c;下面我们来看看以下几款游戏专用的蓝牙耳机。 …

10 种主数据模型设计示例分享,推荐收藏

主数据模型是主数据管理的基础&#xff0c;一个完整的、可扩展的、相对稳定的主数据模型对于主数据管理的成功起着重要的作用。规划、创建主数据模型的过程&#xff0c;是梳理主数据管理体系的过程&#xff0c;目的是建立一个良好的资源目录结构&#xff0c;划分合理的资源粒度…