【题解】CF1553G Common Divisor Graph 并查集、线性筛、质因数分解
性质:答案不超过 \(2\) 。
考虑选定点 \(s\) ,点 \(t\) 。
新点的点权分别为 \(a_s(a_s+1),a_t(a_t+1)\) 。
\(\forall x\in N,2|x(x+1)\) 。
因此两个新点之间一定是有边的,并且两个新点分别与 \(s\) 、 \(t\) 存在边。
那么考虑分类讨论答案为 \(0\) 和 \(1\) 时的情况:
-
若答案为 \(0\) 代表在不加新点的情况下 \(s\) 和 \(t\) 属于同一个连通块。考虑如何维护连通块。若存在一条边 \((u,v)\) 那么 \(a_u,a_v\) 一定存在同一个质因子。那么考虑枚举质因子 \(x\) ,每次合并所有点权是 \(x\) 的倍数的点,每次相当于枚举一个“团”,因为题目的特殊性质可知任意一条边属于至少一个团。
-
对于一个质因数 \(x\), \(rt[x]=y\) 当且仅当 \(y\) 是并查集森林中的一个根节点且在 \(y\) 所在的集合内存在一个点的点权是 \(x\) 的倍数,若答案为 \(1\) ,代表存在一个点 \(p\) 满足 \(a_p(a_p+1)\) 存在两个质因数 \(a,b\) 使得 \(rt[a] = get(s),rt[b] = get(t)\) 。枚举 \(a_{p+1}\) 的质因数即可(即枚举所有选一个点可能的合并),\(a_{p+1}\) 的不同的质因数至多是 \(7\) 个,因此边数至多是 \(21n + 7n\) ,
std::set
维护即可。
对于质因数分解,可以线性筛的时候维护最小质因数。