考场上想出了思路,但是没能写出来代码,实在可惜
题意简述
有 $n\le 1e5$ 个正整数,每个数值域都是 $[1,10^6]$,并且最多有 $7$ 个因数。 请你求出最少选多少个数能使得乘积是平方数。
思路
最多 $7$ 个因数 $\leftrightarrow$ 最多两个质因数
而且对于一个质因数,显然我们还可以把它的指数膜个 $2$。如果指数到最后是 $0$,那么我们直接扔掉这个质因数;如果两个质因数指数都是 $0$,那好了,直接输出 $1$,结束程序。
然后就是一个数等于 $p$ 或者 $p\times q$ 的情况了。$p$ 的情况就加边 $(1,p)$,$p\times q$ 的情况就加边 $(p,q)$,然后求一个最小环即可。 而且我们发现,一个环上顶多有一个点在 $>1000$ ,那么我们可以以 $1~1000$ 中的点为起点,分别使用 $BFS$ 找环法。这样只能找到包含某个点的最小环,但这足够了,因为这个环必然包含一个编号小于等于 $1000$ 的点。而我们只会在质数间连边,所以我们的实际复杂度比你想象的要小很多!
怎么想到的
主要就是如何转换为最小环那一步。首先这个相当于我们选若干个数,分解成 $1\times p$ 或者 $p\times q$ 的形式,然后几个数覆盖起来,每个质数 $p$ 都得被算偶数次($0$ 也是偶数,不算到也是可以的)。那这样我们的总乘积中,每个质因数都是偶数次方,那就是完全平方数了。
考虑到一个简单的环上的每个点度数都是 $2$,所以我们就能想到把它建成图,然后跑最小环。那么有小朋友(无 中 生 友)就问了,会不会有环上的点度数为 $4,6,8$,甚至更大的偶数呢?其实这个就相当于一个点被算了很多次嘛,但是我们要求的是“最少多少个数的积是平方数”,也就是我们要让环尽量的小。容易证明,一个最小的环肯定是简单环。(因为如果你是一个复合的环,那么肯定能拆出来若干的简单环,答案更优)
代码
1 |
|