交流中的喵喵
Preface
喵喵可爱!
Problem
给定 \(n\) 个点,每个点的权值为 \(a_i\),假设两个点分别为 \(u\) 和 \(v\),如果 \(\gcd(a_u,a_v) \ne 1\),则在这两个点间连一条双向边。求点 \(s\) 到 \(t\) 最少经过多少条边,如果两个点不能相互到达,则输出 -1。
Solution
需要注意的是,如果我们根据定义来建图,那么图将会很大。考虑建一个二分图,它的左边部分由权值为 \(a_i\) 的 \(n\) 个点组成。而在右边部分,每个点都是质数,这些质数不大于左边部分的最大质数。也就是说我们可以建一些虚点,对于虚点 \(n+d\),将所有有 \(d\) 这个质因子的所有点与这个虚点相连。这样只需要枚举每个 \(a_i\) 的质因数即可,建图复杂度是 \(O(n\sqrt{\max_{i=1}^{n}a_i})\)。接下来只需要跑个最短路即可。因为边权为 \(1\),所以对虚点的入边边权建为 \(1\),出边建为 \(0\)。总时间复杂度 \(O(n\sqrt{\max_{i=1}^{n}a_i}+m\log m)\)。
Code
自己写(

浙公网安备 33010602011771号