题目解析:小M的数组变换
小M拿到一个数组,她可以进行多次操作,每次操作可以选择两个元素 aiai 和 ajaj,并选择 aiai 的一个因子 xx,然后将 aiai 变为 ai/xai/x,并将 ajaj 变为 aj×xaj×x。她的目标是通过有限次操作,使得数组中的每个元素最多只包含一种素因子。
素因子的定义是:若 xx 能被素数 pp 整除,那么 pp 是 xx 的一个素因子。例如,1212 的素因子有 22 和 33。
你的任务是判断是否有可能通过有限次操作,使数组中的每个元素最多只包含一种素因子。如果可以,输出 "Yes",否则输出 "No"。
问题分析
-
操作定义:
- 每次操作可以选择两个数
a[i]和a[j],然后选取a[i]的一个因子x,将a[i]变为a[i] / x,并将a[j]变为a[j] * x。 - 目标是使得每个数只包含一种素因子,这意味着每个数应该可以表示为
p^k,其中p是素数,k是一个整数。
- 每次操作可以选择两个数
-
观察:
-
数字的因子分解是基于素数的。如果我们希望通过操作让每个数最多只包含一个素因子,那么我们需要确保:
- 数字之间的公共素因子能够被提取出来进行调整。
- 通过操作,所有数字最终只包含相同的一个素因子,或者各自的素因子不会交叉干扰。
-
-
主要思路:
- 我们可以考虑将每个数分解为素因子,检查这些数之间是否有交集。
- 如果每个数的素因子集合可以通过某些操作合并为一个集合,使得每个数的素因子数目不超过 1,那么就可以通过操作达成目标。
解决方案
-
分解素因子:
- 通过分解每个数字的素因子,得到每个数字的素因子集合。
-
判断条件:
- 如果所有数字的素因子可以合并为一个统一的集合,使得每个数最多包含一个素因子,则返回 "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")
代码解释
-
get_prime_factors:- 该函数接收一个数字
x,并返回x的所有素因子。通过逐步除以 2 和奇数来提取素因子,直到x为素数。
- 该函数接收一个数字
-
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是编程学习和实践中的得力助手。