【YBT2023寒假Day12 C】树的计数 II(prufer)(结论)(数学)
树的计数 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,a2x−1,再由不等式有着肯定不是 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 yx⩽y 的时候,条件是 x∣yx|yx∣y。
那当 x∣yx|yx∣y 的时候,显然是可以连边形成 xxx 个连通块的。
那我们考虑证明 x∤yx\nmid yx∤y 的时候会出现环:
那如果有边 (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|yx∣y。
那因为有编号,所以还有连边方式,显然连了一个之后后面都确定,那你就可以让一开始那个点最后在哪个连通块,所以是 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*xcntx∗x 而不是 cntxcnt_xcntx。
那在这里就全是 cntx∗xcnt_x*xcntx∗x。
然后至于 000 号虚拟点,那你可以理解为连向它就是连向之前树中可以连的任意一个,那任意一个都会产生各自的贡献,那你就把每个可以的位置的 cntx∗xcnt_x*xcntx∗x 加起来即可(记为 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;
}
相关文章:

【YBT2023寒假Day12 C】树的计数 II(prufer)(结论)(数学)
树的计数 II 题目链接:YBT2023寒假Day12 C 题目大意 给你一个长度为 n 的排列 p,问你有多少个不同的有标号无根树,满足如果 i,j 有边那 pi,pj 也有边。 思路 首先可以把排列变成置换环。 注意到是树,发现一个置换中似乎不太可…...

深入浅出C++ ——多态
文章目录一、多态的概念二、多态的定义及实现1. 多态的构成条件2. 虚函数3. 虚函数的重写4. virtual的使用:5. 虚函数重写的两个例外:6. C11 override 和 final7. 重载、重写、重定义的对比三、抽象类四、多态的原理1. 虚函数表2. 多态的原理3. 静态绑定…...

华为OD机试真题Python实现【整数编码】真题+解题思路+代码(20222023)
整数编码 题目 实现一个整数编码方法 使得待编码的数字越小 编码后所占用的字节数越小 编码规则如下 编码时7位一组,每个字节的低 7 位用于存储待编码数字的补码字节的最高位表示后续是否还有字节,置1表示后面还有更多的字节,置0表示当前字节为最后一个字节采用小端序编码…...

FPGA纯Vhdl实现MIPI CSI2RX视频解码输出,OV13850采集,提供工程源码和技术支持
目录1、前言2、Xilinx官方主推的MIPI解码方案3、纯Vhdl方案解码MIPI4、vivado工程介绍5、上板调试验证6、福利:工程代码的获取1、前言 FPGA图像采集领域目前协议最复杂、技术难度最高的应该就是MIPI协议了,MIPI解码难度之高,令无数英雄竞折腰…...

7 个 JavaScript Web API 来构建你不知道的未来网站
随着技术的日新月异,为开发人员提供了令人难以置信的新工具和API。但据了解,在100 多个 API中,只有5%被开发人员积极使用。让我们来看看一些有用的Web API,它们可以帮助您将网站推向月球!🌕🚀1.…...

跟ChatGPT,聊聊ChatGPT
不仅“上知天文、下知地理”,似乎还能对答如流、出口成诗,甚至还能写剧本、编音乐、写代码——最近,一款名叫ChatGPT的人工智能聊天机器人火爆全球。由此,一系列关于新一代技术变革、人工智能替代人力、巨头企业扎堆入局AI的讨论在…...

Java 数组(详细教学 基础篇)
一、数组的基本要素 标识符:数组的名称数组元素:数组中存放的数据元素下标:对数组元素进行编号,数组下标从0开始来访问元素类型:数组元素的数据类型 二、数组的五种赋值方法和使用方法 声明数组 int[] arr;//开辟三个…...

python装饰器原理 | 常用装饰器使用(@cache, @lru_cache)
🚀 关于python的装饰器原理介绍可看这里,讲的挺简洁易懂:python装饰器原理 ⭐ 弄懂装饰器原理后,来学学常用装饰器。 文章目录1、cache, lru_cache1、cache, lru_cache 也就是一种装饰在被执行的函数上,将其执行的结果…...

[oeasy]python0090_极客起源_wozniac_苹果公司_Jobs_Wozniac
极客起源 回忆上次内容 上次回顾了 DEC公司的兴起 从IBM的大型机 到DEC的小型机Mini Computer 再到DEC的终端 VT-100 计算机基础元器件发生了进化 从ENIAC的 电子管到PDP系列的 晶体管 新的器件 体积小了价格低了稳定性 提高了而且 连成了网络 ARPA网 就是 最初的Internet …...

Spring基础总结(下)
简介 本章节通过手写一个简单的 Spring 框架来加深对 Spring 框架源码以及设计思想的理解; 实现步骤 BeanScope 枚举代码 public enum BeanScope { sigleton, prototype; }AppConfig 配置类 // 定义包扫描路径 ComponentScan("com.dufu.spring"…...

设计模式面试题
设计模式分为 创建型 工厂模式 单例 原型行为性 责任链 迭代器 命令中介型结构性 适配器 代理 门面 装饰器 组合 桥接单例设计模式 懒汉式 用到时再创建,省内存 饿汉式 类创建时就创建,会占用内存 内部类 用到时再创建,省内存 线程池、数据…...

需要知道的一些API接口的基础知识
API是应用程序编程接口(Application Programming Interface)的缩写,能够起到两个软件组件之间的连接器或中介的作用。此类接口往往通过一组明确的协议,来表示各种原始的请求和响应。API文档可以向开发人员展示请求和响应是如何形成…...

互融云数字资产管理平台综合解决方案
自十八大以来,发展数字经济逐步成为了国家战略。从2015年国务院印发《促进大数据发展行动纲要》,到2020年4月中央发布《关于构建更加完善的要素市场化配置体制机制的意见》,再到2022年底出台《中共中央、国务院关于构建数据基础制度更好发挥数…...

记住这12个要点,你也能打造出让HR和技术主管前一亮的前端简历
第一篇章:吸引HR 如果你想在众多简历中脱颖而出,需要注意以下几点: 1、突出你的亮点: 给你的简历一个吸引人的文件命名和头部,突出你的关键技能和经验。 2、采用简洁的语言: 用简单易懂的语言来描述你的…...

AQS学习:ReentrantLock源码解析
前言 多线程知识中理解了ReentrantLock之后,对于整个AQS也会有大概的理解,后面再去看其它锁的源码就会比较容易。下面带大家一块来学习ReentrantLock源码。 概述 ReentrantLock是可重入的互斥锁,虽然具有与synchronized相同功能࿰…...

RocketMQ源码分析消息消费机制—-消费端消息负载均衡机制与重新分布
1、消息消费需要解决的问题 首先再次重复啰嗦一下 RocketMQ 消息消费的一些基本元素的关系 主题 —》 消息队列(MessageQueue) 1 对多。 主题 —》 消息生产者,一般主题会由多个生产者组成,生产者组。 主题 —》 消息消费者,一般一个主题…...

华为OD机试真题Python实现【数据分类】真题+解题思路+代码(20222023)
数据分类 题目 对一个数据a进行分类, 分类方法是,此数据a(4 个字节大小)的 4 个字节相加对一个给定值b取模, 如果得到的结果小于一个给定的值c则数据a为有效类型,其类型为取模的值。 如果得到的结果大于或者等于c则数据a为无效类型。 比如一个数据a = 0x01010101,b = 3…...

vue项目中引入字体包
问题: 项目开发过程中,因UI的显示要求,需要引入一些字体,那如何引入外部字体呢?很简单,只需要以下3步 一 下载对应的字体包文件,放置到我们的项目中 比如我需要PingFangSC的系列字体&#…...

Linux 文件相关操作
文件相关操作 编辑文件 命令: vi 文件名 然后输入i进入编辑模式 编辑完成后输入esc退出编辑 输入:wq保存即便目录下没有这个文件,也可以想使用vi 文件名进行编辑,保存退出后会创建这个文件 查看文件内容 命令: cat 文件名复…...

【计算机网络】应用题方法总结
0.前言本篇博客主要记录自己在学习到的部分解决计算机网络应用题方法,主要参考视频如下:计算机网络期末复习 应用题_哔哩哔哩_bilibili【计算机网络】子网划分题型总结_哔哩哔哩_bilibili循环冗余码step 1:确定冗余码长度。多项式最高位即为冗…...

Linux 浅谈之性能分析工具 perf
Linux 浅谈之性能分析工具 perf HELLO,各位博友好,我是阿呆 🙈🙈🙈 这里是 Linux 浅谈系列,收录在操作系统专栏中 😜😜😜 本系列将记录一些阿呆个人整理的 OS 相关知识…...

代码随想录-Day7:四数相加、三数之和
454. 四数相加 II 给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0示例 1: 输入࿱…...

jsp在线考试系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
一、源码特点 jsp 在线考试系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5 开发,数据库为Mysql,使用j…...

【总结】2023数学建模美赛!收官!
今年的美赛时间是2.17-2.21,这学期疫情放开了之后管的没那么严了,我们小组就都提前一天到学校了,全力准备17号的比赛。 时间流程 刚拿到6个题的时候,我们三个人一人看两个题,每个人从两个题中再选出来一个自己觉得有…...

C# GDI+ winform绘图知识总结
一、Graphics GDI是GDI(Windows Graphics Device Interface)的后继者,它是.NET Framework为操作图形提供的应用程序编程接口,主要用在窗体上绘制各种图形图像,可以用于绘制各种数据图像、数学仿真等。 Graphics类是G…...

【研究空间复用及函数调用问题】
本篇总结函数调用过程会存在的一些奇怪现象,空间复用问题,其实本质上涉及函数调用的底层原理,理解函数栈帧的创建和销毁这样的问题直接迎刃而解。1.空间复用问题案例1案例22.函数调用过程不清晰问题案例33.总结1.空间复用问题 案例1 我们先…...

SQL常用查询语句
SELECT语句用于查询数据库中的内容 目录 1 查询指定表的所有内容 2 显示所有行的指定列 3 显示指定行的指定列 4 对查询结果进行排序 4.1 按照单一字段排序 4.2 多重排序 5 查询数据总数 5.1 查询一共有多少行 5.2 统计符合条件的有多少行 6 给查询出来的…...

【Python实战】一大波高颜值主播来袭:快看,某网站颜值排名,为了这个排名我可是大费周章啦,第一名不亏是你...(人脸检测+爬虫实战)
导语 民间一直有个传闻......「听说某站的小哥哥小姐姐颜值都很高哦!」 (不是颜值高才能加入,是优秀的人恰好颜值高) 所有文章完整的素材源码都在👇👇 粉丝白嫖源码福利,请移步至CSDN社区或文末…...

Linux进程学习【三】
✨个人主页: Yohifo 🎉所属专栏: Linux学习之旅 🎊每篇一句: 图片来源 🎃操作环境: CentOS 7.6 阿里云远程服务器 Perseverance is not a long race; it is many short races one after another…...

Spring自动装配的底层逻辑
Spring是如何自动装配Bean的?看源码一些自己的理解,如有错漏,请指正 使用Spring之前我们要先去web.xml中设置一下Spring的配置文件,在Spring的配置文件中,是通过component-scan扫描器去扫描base-package底下所有的类装…...