【题解】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 维护即可。

对于质因数分解,可以线性筛的时候维护最小质因数。

代码记录

posted @ 2021-09-30 16:36  Themaxmaxmax  阅读(23)  评论(0编辑  收藏  举报