ZR#959
ZR#959
解法:
对于一个询问,设路径 $ (u, v) $ 经过的所有边的 $ gcd $ 为 g,这可以倍增求出。
考虑 $ g $ 的所有质因子 $ p1, p2, \cdots , pk $ ,因为 $ g \leq 10^6 $ ,所以 $ k \leq 7 $ 。
则最终的路径的 $ gcd $ 为 $ 1 $,等价于对于每个 $ 1 \leq i \leq k $ ,存在至少一条路径上的边不是 $ p_i $ 的倍数。我们要求 $ l $ 的最小值,即等价于对于每个 $ 1 \leq i \leq k $ ,计算出最长的不满足条件的 $ l′ $,则最终答案即为所有 $ i $ 对应的 $ l′ $ 的最大值加一(无解的情况除外)。
考虑对于某个 pi 而言,我们如何求出这样的 $ l′ $ 。我们考虑将所有满足 $ p_i | w $的边拿出来,并只保留这些边。则 $ l′ $ 等价于在这样得到的森林中,经过 $ (u, v) $ 的最长路径。
使用简单的树形DP即可求出某个点向子树方向以及向祖先方向延伸的最长路径,分类讨论即可对于每个 $ (u, v) $ 求出对应的 $ l′ $ 。
接下来考虑无解的情况。事实上,无解等价于刚刚求出的某个 $ l′ $ 和经过 $ (u, v) $ 的最长路径相同。经过 $ (u, v) $ 的最长路径和刚刚是同样的问题,直接对整棵树都做一遍树形 DP 即可。
接下来考虑复杂度。求出每个询问的 $ gcd $ 的复杂度为 $ O(q \log_2 n \log_2 w) $ ,而求出最长路的部分是与边数成线性的,而每条边至多出现 7 次,因此该做法的总复杂度即为 $ O(q \log_2 n \log_2 w + nω(w)) $ 。
CODE:
//待补充
原文地址:https://www.cnblogs.com/Repulser/p/11494359.html
- Oracle 12c PDB迁移(一)(r10笔记第56天)
- 【Go 语言社区】Go worker线程池
- Oracle 12C打补丁的简单尝试(r10笔记第55天)
- 【Go 语言社区】奇妙的go语言(网页下载)-转
- 【Go 语言社区】golang的bufio用于内容解析
- [Go语言]从Docker源码学习Go——指针和Structs - lemon_bar
- Git 项目推荐 | Go 语言读写 INI 文件工具包
- 初识Python (r10笔记第52天)
- 挑战数据结构与算法面试题——统计上排数在下排出现的次数
- Go语言的 10 个实用技术--转
- MySQL反连接的优化总结(r10笔记第51天)
- python基础知识——内置数据结构(列表)
- 【Go 语言社区】Go语言Slice去重
- 【Go 语言社区】Golang 语言再谈接口
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 用SQL查询Oracle数据库名和实例名
- Hadoop历史服务器配置详细步骤
- MySQL常见关键字优先级
- Linux进程管理命令及状态详解
- sqoop把hive数据导入mysql出现中文乱码
- Flink实现WordCount(实操详细步骤)
- 在客户端创建要素图层 (FeatureLayer)
- 11.深入k8s:kubelet工作原理及其初始化源码分析
- 关于搜索,你不知道的是.....
- oracle查询表前十条数据
- sql语句查oracle版本号
- 商业鬼才教你 模板方法模式
- 用SQL语句查看Oracle数据表的结构信息
- Oracle建表语法
- 剑指Offer第1题详解(附Java、Python实现代码)