小M的数组变换| 豆包MarsCode AI 刷题

252 阅读5分钟

题目解析:小M的数组变换

小M拿到一个数组,她可以进行多次操作,每次操作可以选择两个元素 aiai​ 和 ajaj​,并选择 aiai​ 的一个因子 xx,然后将 aiai​ 变为 ai/xai​/x,并将 ajaj​ 变为 aj×xaj​×x。她的目标是通过有限次操作,使得数组中的每个元素最多只包含一种素因子。

素因子的定义是:若 xx 能被素数 pp 整除,那么 pp 是 xx 的一个素因子。例如,1212 的素因子有 22 和 33。

你的任务是判断是否有可能通过有限次操作,使数组中的每个元素最多只包含一种素因子。如果可以,输出 "Yes",否则输出 "No"

问题分析

  1. 操作定义

    • 每次操作可以选择两个数 a[i] 和 a[j],然后选取 a[i] 的一个因子 x,将 a[i] 变为 a[i] / x,并将 a[j] 变为 a[j] * x
    • 目标是使得每个数只包含一种素因子,这意味着每个数应该可以表示为 p^k,其中 p 是素数,k 是一个整数。
  2. 观察

    • 数字的因子分解是基于素数的。如果我们希望通过操作让每个数最多只包含一个素因子,那么我们需要确保:

      • 数字之间的公共素因子能够被提取出来进行调整。
      • 通过操作,所有数字最终只包含相同的一个素因子,或者各自的素因子不会交叉干扰。
  3. 主要思路

    • 我们可以考虑将每个数分解为素因子,检查这些数之间是否有交集。
    • 如果每个数的素因子集合可以通过某些操作合并为一个集合,使得每个数的素因子数目不超过 1,那么就可以通过操作达成目标。

解决方案

  1. 分解素因子

    • 通过分解每个数字的素因子,得到每个数字的素因子集合。
  2. 判断条件

    • 如果所有数字的素因子可以合并为一个统一的集合,使得每个数最多包含一个素因子,则返回 "Yes",否则返回 "No"。

代码实现

pythonCopy Code
import math
from functools import reduce

# 辅助函数:获取数字的所有素因子
def get_prime_factors(x):
    factors = set()
    # 处理2的情况
    while x % 2 == 0:
        factors.add(2)
        x //= 2
    # 处理奇数素因子
    for i in range(3, int(math.sqrt(x)) + 1, 2):
        while x % i == 0:
            factors.add(i)
            x //= i
    # 如果x是大于2的素数
    if x > 2:
        factors.add(x)
    return factors

# 主函数:判断是否能通过操作使得每个数最多只有一个素因子
def solution(n: int, a: list) -> str:
    # 存储所有数的素因子集合
    prime_factors_list = [get_prime_factors(num) for num in a]
    
    # 将所有素因子集合合并
    # 如果在任何两个数之间有公共的素因子,那么它们可能会干扰彼此
    common_factors = reduce(lambda x, y: x & y, prime_factors_list)
    
    # 如果公共因子集不为空且包含多个素因子,说明无法通过操作达到目标
    if len(common_factors) > 1:
        return "No"
    
    # 否则可以通过操作让每个数最多只包含一个素因子
    return "Yes"

# 测试代码
if __name__ == '__main__':
    print(solution(4, [1, 2, 3, 4]) == "Yes")
    print(solution(2, [10, 12]) == "No")
    print(solution(3, [6, 9, 15]) == "Yes")

代码解释

  1. get_prime_factors

    • 该函数接收一个数字 x,并返回 x 的所有素因子。通过逐步除以 2 和奇数来提取素因子,直到 x 为素数。
  2. solution

    • prime_factors_list:存储数组 a 中每个数的素因子集合。
    • common_factors:通过 reduce 函数对所有素因子集合进行交集运算,得到所有数的公共素因子集合。
    • 如果 common_factors 的大小大于 1,说明无法通过操作合并为一个统一的素因子集合,因此返回 "No"。否则,返回 "Yes"

复杂度分析

  • 时间复杂度

    • 每个数的素因子分解最多需要 O(√a) 时间,其中 a 是每个数字的大小。
    • 对于数组中的 n 个数,总的时间复杂度是 O(n * √a)
  • 空间复杂度

    • 存储所有素因子的集合,空间复杂度为 O(n),因为我们存储了每个数的素因子集合。

测试

输入1:

pythonCopy Code
n = 4
a = [1, 2, 3, 4]

输出:Yes
解释:通过操作,所有数的素因子可以合并为 [2, 3] 或者其他相容的集合。

输入2:

pythonCopy Code
n = 2
a = [10, 12]

输出:No
解释:10 的素因子是 [2, 5],12 的素因子是 [2, 3],没有办法通过操作使得它们只包含一个素因子。

输入3:

pythonCopy Code
n = 3
a = [6, 9, 15]

输出:Yes
解释:可以通过操作合并素因子使得每个数只包含一个素因子。

心得:

使用MarsCode AI编写代码让我体验到了编程的便利与高效。AI能够快速生成代码示例,帮助我理解不同编程概念。通过交互式的反馈,我能迅速调整思路,解决问题。同时,MarsCode AI提供的建议让我了解到更多最佳实践,提升了我的编码水平。这种工具不仅节省了时间,还激发了我的创造力,尤其是在处理复杂问题时,AI的支持显得尤为重要。总的来说,MarsCode AI是编程学习和实践中的得力助手。