Loading

3.26 CW 模拟赛 T1. 公约数神庙

前言

补题就好好补, 进入状态

圣剑忘在寝室了, 我咧个豆, 下午再来一次检查一套连招给我送回实外
希望 \(\rm{deepseek}\) 解决了服务器繁忙问题\((\)然后就繁忙了\()\)

思路

首先不难想到的是暴力建图然后跑传递闭包
但是这样复杂度是 \(\mathcal{O}(n^2)\) 的, 只能趋势

发现如果有优化建图的方法, 那么复杂度就可以优化到 \(\mathcal{O}\left(\dfrac{n^2}{w}\right)\), 看上去是很好的
那么怎么优化建图呢?

首先我们考虑把它当做子问题处理

子问题

分析题目

建图在一个序列 α\alpha 的基础上
倘若 gcd(αi,αj)>1\gcd(\alpha_i, \alpha_j) > 1 则连边 iji \to j

αi1000\alpha_i \leq 1000, 求建图在 O(n2)\mathcal{O} (n^2) 以下的方法

找初步性质

首先 gcd\rm{gcd} 问题

  • gcd\rm{gcd}
    • 尝试计算 xgcdx | \textrm{gcd}gcd\textrm{gcd} 个数从而计算出 x=gcdx = \textrm{gcd}gcd\textrm{gcd} 个数
    • 指数拆分法
    • 钦定 gcd\rm{gcd} 的值, 再去找性质
      • 常常找 gcd\rm{gcd} 的倍数

发现都没有用, 再去找性质
考虑 gcd(αi,αj)>1\gcd(\alpha_i, \alpha_j) > 1 的本质是存在质数 xαi,xαjx | \alpha_i, x | \alpha_jx>1x > 1
因此如果我们考虑 10001000 以内的 π=168\pi = 168 个质数, 可以在 O(nπ)\mathcal{O} (n \pi) 内建出 π\pi 条可达链, 在链 lil_i 上, 你只要能走到 li,jl_{i, j} 就可以走到 li,kjl_{i, k \geq j}

转化用于做题

那么怎么去判断可达性?
不难发现对于点 vv, 其最多在 44 条链上
那么我们有两种方法去做

似乎可以直接维护传递闭包了

但是问题出在 00 上, 关于 00 怎么去做呢?
如果出现了 00, 其被视为 10001000 内所有质因数之积, 严重影响了优化建图
于是我们考虑对 00 进行特殊处理
分讨

  • x=yx = y 显然可行
  • αx=αy=1\alpha_x = \alpha_y = 1 显然不可行
  • αx=αy=0\alpha_x = \alpha_y = 0 显然判断中间是否有 >1> 1 的数
  • 两数之间如果有 00 显然可行

似乎解决了, 但是你发现 O(n2w)\mathcal{O}\left(\dfrac{n^2}{w}\right) 的空间复杂度成为了瓶颈, 睡觉
于是考虑分开对链处理

bitset\rm{bitset}

问题出在不能对点处理, 考虑把链当做整体处理
不难发现如果把询问按照 xx 从大到小排序, 我们可以离线下来询问

于是根据询问, 我们动态维护每一条链的可达后缀, 然后做一下就好了

利用拓扑序 dp\rm{dp}

发现可达后缀可以用单点表示
我们发现我们只需要维护从点 ii 出发, 每条链上最前能走到哪
fi,pf_{i, p} 表示从 ii 出发, 在 pp 链上能走到的最近位置
fi,p={iαipminikfk,pαip\begin{align*} f_{i, p} = \begin{cases} i & \alpha_i \mid p \\ \min\limits_{i \to k} f_{k, p} & \alpha_i \nmid p \end{cases} \end{align*}

本质上是对 bitset\rm{bitset} 的优化

总结

不互质的神奇性质
神奇优化建图

posted @ 2025-03-26 19:20  Yorg  阅读(20)  评论(3)    收藏  举报