from math import gcd from functools import reduce def solution(n: int, a: list) -> str: def prime_factors(num): factors = set() d = 2 while num > 1: while num % d == 0: factors.add(d) num //= d d += 1 if d * d > num: if num > 1: factors.add(num) break return factors all_factors = set() for num in a: all_factors.update(prime_factors(num)) if len(all_factors) <= n: return "Yes" else: return "No" if name == 'main': print(solution(4, [1, 2, 3, 4]) == "Yes") print(solution(2, [10, 12]) == "No") print(solution(3, [6, 9, 15]) == "Yes") 解题思路 素因子分解: 首先,我们需要一个函数 prime_factors 来分解一个数的所有素因子。这个函数将接受一个整数 num,并返回一个包含 num 所有素因子的集合。 使用试除法,从最小的素数 2 开始,逐一尝试整除 num,直到 num 被除到 1 或者无法再被当前素数整除为止。如果 num 仍大于 1,则 num 本身就是一个素数,应被添加到因子集合中。 收集所有数的素因子: 遍历列表 a 中的每个数,使用 prime_factors 函数获取其所有素因子,并将这些因子添加到一个集合 all_factors 中。 使用集合是为了自动去重,因为不同的数可能共享相同的素因子。 判断素因子数量与数组长度的关系: 如果 all_factors 的大小(即不同素因子的数量)小于等于 n,则意味着我们可以通过选择这些素因子对应的数(每个素因子至少对应一个数在列表 a 中),使用不超过 n 个数,使它们的 GCD 大于 1(因为这些数的 GCD 至少会是这些素因子中的一个)。 如果 all_factors 的大小大于 n,则无论如何选择,我们都无法确保所选的 n 个数的 GCD 大于 1,因为至少会有一个素因子无法被覆盖到。 示例讲解 示例 1:solution(4, [1, 2, 3, 4]) 素因子集合:{1, 2, 3}(注意:1 不是素数,但在这里不影响判断,因为 GCD 不考虑 1) 素因子数量:3 n 的值:4 结果:"Yes"(因为可以选择 2, 3, 4,它们的 GCD 是 1 以外的数,但此处主要是为了说明数量关系,实际上只需选择 2 和 3 即可) 示例 2:solution(2, [10, 12]) 素因子集合:{2, 3, 5} 素因子数量:3 n 的值:2 结果:"No"(因为无法用 2 个数覆盖所有素因子) 示例 3:solution(3, [6, 9, 15]) 素因子集合:{2, 3, 5} 素因子数量:3 n 的值:3 结果:"Yes"(可以选择 6, 9, 15 中的任意三个,它们的 GCD 至少是 3)