前言
补题就好好补, 进入状态
圣剑忘在寝室了, 我咧个豆, 下午再来一次检查一套连招给我送回实外
希望 \(\rm{deepseek}\) 解决了服务器繁忙问题\((\)然后就繁忙了\()\)
思路
首先不难想到的是暴力建图然后跑传递闭包
但是这样复杂度是 \(\mathcal{O}(n^2)\) 的, 只能趋势
发现如果有优化建图的方法, 那么复杂度就可以优化到 \(\mathcal{O}\left(\dfrac{n^2}{w}\right)\), 看上去是很好的
那么怎么优化建图呢?
首先我们考虑把它当做子问题处理
子问题
分析题目
建图在一个序列 α 的基础上
倘若 gcd(αi,αj)>1 则连边 i→j
αi≤1000, 求建图在 O(n2) 以下的方法
找初步性质
首先 gcd 问题
- gcd
- 尝试计算 x∣gcd 的 gcd 个数从而计算出 x=gcd 的 gcd 个数
- 指数拆分法
- 钦定 gcd 的值, 再去找性质
发现都没有用, 再去找性质
考虑 gcd(αi,αj)>1 的本质是存在质数 x∣αi,x∣αj 且 x>1
因此如果我们考虑 1000 以内的 π=168 个质数, 可以在 O(nπ) 内建出 π 条可达链, 在链 li 上, 你只要能走到 li,j 就可以走到 li,k≥j
转化用于做题
那么怎么去判断可达性?
不难发现对于点 v, 其最多在 4 条链上
那么我们有两种方法去做
似乎可以直接维护传递闭包了
但是问题出在 0 上, 关于 0 怎么去做呢?
如果出现了 0, 其被视为 1000 内所有质因数之积, 严重影响了优化建图
于是我们考虑对 0 进行特殊处理
分讨
- x=y 显然可行
- αx=αy=1 显然不可行
- αx=αy=0 显然判断中间是否有 >1 的数
- 两数之间如果有 0 显然可行
似乎解决了, 但是你发现 O(wn2) 的空间复杂度成为了瓶颈, 睡觉
于是考虑分开对链处理
bitset
问题出在不能对点处理, 考虑把链当做整体处理
不难发现如果把询问按照 x 从大到小排序, 我们可以离线下来询问
于是根据询问, 我们动态维护每一条链的可达后缀, 然后做一下就好了
利用拓扑序 dp
发现可达后缀可以用单点表示
我们发现我们只需要维护从点 i 出发, 每条链上最前能走到哪
记 fi,p 表示从 i 出发, 在 p 链上能走到的最近位置
fi,p={ii→kminfk,pαi∣pαi∤p
本质上是对 bitset 的优化
总结
不互质的神奇性质
神奇优化建图