给定一组n个正整数,要求每次选其中 一个数乘以或除以一个素数(称为一次 凑数),问至少需要凑数多少次可以把 所有的数都凑成相等。
时间: 2024-04-21 18:29:39 浏览: 216
这是一道比较经典的数学问题,被称为经典的“数论-组合”问题。我们可以用质因数分解的方法来解决这个问题。
假设这组n个正整数的质因数分解后的形式为:
$a_1 = p_{1}^{c_{1,1}}p_{2}^{c_{1,2}}...p_{k}^{c_{1,k}}$
$a_2 = p_{1}^{c_{2,1}}p_{2}^{c_{2,2}}...p_{k}^{c_{2,k}}$
...
$a_n = p_{1}^{c_{n,1}}p_{2}^{c_{n,2}}...p_{k}^{c_{n,k}}$
其中 $p_{1},p_{2},...,p_{k}$ 是这n个数中所有可能的素数。对于一个素数 $p_i$,我们可以对所有 $c_{j,i}$ 取模 3,得到一个长度为n的01串 $S_i$,其中第j位为0表示 $a_j$ 在 $p_i$ 的指数上模3余0,为1表示模3余1,为2表示模3余2。
显然,如果存在一个素数 $p_i$,使得 $S_i$ 中所有位相同,那么所有数都可以通过乘以或除以 $p_i$ 来凑成相等,所需要的次数就是 $S_i$ 中0和1的个数之和。
否则,我们可以选择两个不同的素数 $p_i$ 和 $p_j$,将 $S_i$ 和 $S_j$ 中不同的位进行交换,得到一个新的01串 $S'$。我们可以证明,如果 $S'$ 中所有位相同,那么所有数都可以通过乘以或除以 $p_i$ 和 $p_j$ 来凑成相等,所需要的次数就是 $S'$ 中0和1的个数之和。
我们可以用广度优先搜索来求解最小的凑数次数。初始状态为所有01串都相同,目标状态为所有01串都为0或1。每次扩展一个状态时,枚举所有可能的素数对,进行上述交换操作,得到一个新的状态,加入队列中。直到找到目标状态为止。
由于素数的个数不超过 $O(\frac{n}{\ln n})$,对于每个素数,需要 $O(n)$ 的时间来计算其对应的01串。因此,总时间复杂度为 $O(n^2 \log n)$。
希望能够帮到你!
阅读全文