交流中的喵喵

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

自己写(

posted @ 2023-08-28 16:46  Akane_Moon  阅读(30)  评论(0)    收藏  举报

“一言(ヒトコト)