当前位置: 首页 > news >正文

【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,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;
}

相关文章:

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

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

深入浅出C++ ——多态

文章目录一、多态的概念二、多态的定义及实现1. 多态的构成条件2. 虚函数3. 虚函数的重写4. virtual的使用&#xff1a;5. 虚函数重写的两个例外&#xff1a;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、福利&#xff1a;工程代码的获取1、前言 FPGA图像采集领域目前协议最复杂、技术难度最高的应该就是MIPI协议了&#xff0c;MIPI解码难度之高&#xff0c;令无数英雄竞折腰…...

7 个 JavaScript Web API 来构建你不知道的未来网站

随着技术的日新月异&#xff0c;为开发人员提供了令人难以置信的新工具和API。但据了解&#xff0c;在100 多个 API中&#xff0c;只有5%被开发人员积极使用。让我们来看看一些有用的Web API&#xff0c;它们可以帮助您将网站推向月球&#xff01;&#x1f315;&#x1f680;1.…...

跟ChatGPT,聊聊ChatGPT

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

Java 数组(详细教学 基础篇)

一、数组的基本要素 标识符&#xff1a;数组的名称数组元素&#xff1a;数组中存放的数据元素下标&#xff1a;对数组元素进行编号&#xff0c;数组下标从0开始来访问元素类型&#xff1a;数组元素的数据类型 二、数组的五种赋值方法和使用方法 声明数组 int[] arr;//开辟三个…...

python装饰器原理 | 常用装饰器使用(@cache, @lru_cache)

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

[oeasy]python0090_极客起源_wozniac_苹果公司_Jobs_Wozniac

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

Spring基础总结(下)

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

设计模式面试题

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

需要知道的一些API接口的基础知识

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

互融云数字资产管理平台综合解决方案

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

记住这12个要点,你也能打造出让HR和技术主管前一亮的前端简历

第一篇章&#xff1a;吸引HR 如果你想在众多简历中脱颖而出&#xff0c;需要注意以下几点&#xff1a; 1、突出你的亮点&#xff1a; 给你的简历一个吸引人的文件命名和头部&#xff0c;突出你的关键技能和经验。 2、采用简洁的语言&#xff1a; 用简单易懂的语言来描述你的…...

AQS学习:ReentrantLock源码解析

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

RocketMQ源码分析消息消费机制—-消费端消息负载均衡机制与重新分布

1、消息消费需要解决的问题 首先再次重复啰嗦一下 RocketMQ 消息消费的一些基本元素的关系 主题 —》 消息队列(MessageQueue) 1 对多。 主题 —》 消息生产者&#xff0c;一般主题会由多个生产者组成&#xff0c;生产者组。 主题 —》 消息消费者&#xff0c;一般一个主题…...

华为OD机试真题Python实现【数据分类】真题+解题思路+代码(20222023)

数据分类 题目 对一个数据a进行分类, 分类方法是,此数据a(4 个字节大小)的 4 个字节相加对一个给定值b取模, 如果得到的结果小于一个给定的值c则数据a为有效类型,其类型为取模的值。 如果得到的结果大于或者等于c则数据a为无效类型。 比如一个数据a = 0x01010101,b = 3…...

vue项目中引入字体包

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

Linux 文件相关操作

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

【计算机网络】应用题方法总结

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

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...