+++ date = "2020-03-15T21:15:00+08:00" draft = false tags = [] title = "Codeforces Round #628 (Div. 2)" authors = ["xry111"] +++ # [Codeforces Round #628](https://codeforces.com/contest/1325) ## [A. EhAb AnD gCd](https://codeforces.com/contest/1325/problem/A) ### 问题重述 给你数 $x$,让你求 $a, b$ 使得 $GCD(a, b) + LCM(a, b) = x$。 ### 题解 假题,只要选择 $a = x-1, b = 1$ 即可。 [代码](https://codeforces.com/contest/1325/submission/73300346) ## [B. CopyCopyCopyCopyCopy](https://codeforces.com/contest/1325/problem/B) ### 问题重述 给你一个数列 $\\mathbf{a} = \\{a_i\\}$, 把它重复 $n$ 次以后得到一个新的数列, 求新的数列的最长严格上升子序列的长度。 ### 题解 假题,我们在第 $k$ 次重复中选择 $\mathbf{a}$ 中第 $k$ 小的元素。 如果所有元素都相同,那么就能选出 $n$ 个。如果有重复的,相同的数只能选一次, 因此答案就是 $\mathbf{a}$ 中不同元素的个数。 [代码](https://codeforces.com/contest/1325/submission/73300691) ## [C. Ehab and Path-etic MEXs](https://codeforces.com/contest/1325/problem/C) ### 问题重述 给你一个树 $G = (V, E)$,让你给出一个双射 $f: E \\rightarrow \\{0, \cdots\, |E|-1\\}$,使得 $$\\max_{u, v} MEX(\\{f(x) | x \\in PATH(u, v)\\})$$ 最小。$PATH(u, v)$ 是 $u$ 到 $v$ 路径上的所有边的集合, $MEX$ 就是博弈论里的那个东西; $$MEX(S) = \\min (\\mathbb{N} \\setminus S)$$ ### 题解 如果有 $3$ 个叶子节点 $u, v, w$,我们把 $0, 1, 2$ 直接分别指定给连接这 $3$ 个叶子节点的边,可以看出此时答案一定是 $2$,不可能有更小的答案。 如果只有 $2$ 个叶子节点,树就退化成一条链,此时无论怎么指定, 答案都是 $|E|$。 [代码](https://codeforces.com/contest/1325/submission/73321338) ## [D. Ehab the Xorcist](https://codeforces.com/contest/1325/problem/D) ### 问题重述 给定非负整数 $u$ 和 $v$,求一个尽量短的数列 $\mathbf{a}$, 使得其中所有数异或起来为 $u$,和为 $v$。 ### 题解 首先如果 $u > v$ 或者 $u$ 和 $v$ 奇偶不同,显然无解。 根据计算二进制和的进位法,容易看出 $$(a \\oplus b) + (a \\cup b) + (a \\cup b) = a + b$$ 根据异或的计算法则,有 $$(a \\oplus b) \\oplus (a \\cup b) \\oplus (a \\cup b) = a \\oplus b$$ 两边对照一下,我们取 $p = u, q = r = (v-u)/2$,则 $\\{p,q,r\\}$ 就是一个合法的答案。可见答案的长度最长就是 $3$。 有一些特殊情况下答案可能更短:如果 $u = v = 0$,则答案是空数列。 如果 $u = v > 0$,则答案就是一个包含 $u$ 的长度为 $1$ 的数列。 如果 $p \\oplus q = p + q$,则我们可以将它们合并起来, 得到长度为 $2$ 的数列。 [代码](https://codeforces.com/contest/1325/submission/73304531) ## [E. Ehab's REAL Number Theory Problem](https://codeforces.com/contest/1325/problem/E) ### 问题重述 给定一个正整数组成的数列 $\\mathbf{a} = \\{a_i\\}$,从中选出尽量少的数, 使得它们的乘积是完全平方数。保证 $|\\mathbf{a}| \leq 10^5$, $a_i \leq 10^6$,且 $a_i$ **至多有 $7$ 个因子**。 ### 题解 $a_i$ 至多有 $7$ 个因子,说明其至多有 $2$ 个不同的质因子 ($3$ 个不同质数乘来乘去就能得到 $8$ 个不同的数了)。 对于每个质因子我们只关心它在 $a_i$ 中出现次数的奇偶性。 如果某个 $a_i$ 本身就是完全平方数,那么只选它就行了。 否则,$a_i$ 要么有 $1$ 个出现奇数次的质因子, 要么有 $2$ 个出现奇数次的质因子。我们将所有质数和 $1$ 作为点建个图, 对于第一种情况,把这个质因子和 $1$ 连起来;对于第二种情况, 把两个质因子连起来。然后容易看出,图中的每个环都是一个合法的答案, 我们要找的就是最小环。BFS 找最小环的时间复杂度是 $\\mathcal{O}(|V||E|)$: 每次 BFS 需要 $\\mathcal{O}(|E|)$ 的时间,需要对于 $|V|$ 个点都作为起点 BFS 一次,这样会超时。但是本题中如果大于 $\\sqrt{\\max a_i}$ 的点在某个环中,则它连接到的必然都是小于 $\\sqrt{\\max a_i}$ 的点。 因此,我们不需要考虑以大于 $\\sqrt{\\max a_i}$ 的点作为起点的情况 (这样的环一定也包含小于 $\\sqrt{\\max a_i}$ 的点, 以这个较小的点做起点就能找到这个环了)。这样就只要枚举 $\\mathcal{O}(\\sqrt{\\max a_i} / \\log \\max a_i)$ 个起点, 边数 $|E|$ 是 $\\mathcal{O}(|\\mathbf{a}|)$ 的,因此总的时间复杂度是 $$\mathcal{O}(\\frac{\\sqrt{\\max a_i} |\\mathbf{a}|}{\\log \\max a_i})$$ 大概算一下也就是不到 $10^8$ 量级,这题时限还是 $3$ 秒,肯定没问题了。 [代码](https://codeforces.com/contest/1325/submission/73333120)