问题描述
小M拿到一个数组,她可以进行多次操作,每次操作可以选择两个元素 ai 和 aj,并选择 ai 的一个因子 xx,然后将 ai 变为 ai/xai/x,并将 aj 变为 aj×xaj×x。她的目标是通过有限次操作,使得数组中的每个元素最多只包含一种素因子。
素因子的定义是:若 x 能被素数 p 整除,那么 p 是 x 的一个素因子。例如,12 的素因子有 2 和 3。
你的任务是判断是否有可能通过有限次操作,使数组中的每个元素最多只包含一种素因子。如果可以,输出 "Yes",否则输出 "No"。
分析
- 每个元素最多只包含一种素数因子 :说明素因子数量小于等于元素的个数
- 如何实现因子是素因子 我们只需要从质数2开始,同时将所有相同因子一起处理完,在进行数字增长即可得到素数因子
for i in range(2,int(math.sqrt(num))+1):
while num%i==0:
all_factors.add(i)
num/=i
- 将得到的素数因子添加入一种数据结构单列集合,且key不能重复这里使用pthon 选择set集合
参考链接 使用dict和set - Python教程 - 廖雪峰的官方网站
代码
def solution(n: int, a: list) -> str:
# PLEASE DO NOT MODIFY THE FUNCTION SIGNATURE
# write code here
all_factors=set()
import math
for num in a:
for i in range(2,int(math.sqrt(num))+1):
while num%i==0:
all_factors.add(i)
num/=i
if num>1:
all_factors.add(num)
return "Yes" if len(all_factors)<=n else "No"
# placeholder return
if __name__ == '__main__':
print(solution(4, [1, 2, 3, 4]) == "Yes")
print(solution(2, [10, 12]) == "No")
print(solution(3, [6, 9, 15]) == "Yes")
本题不难,但是在理解如何得到素数因子这个地方一直想不清楚,最后带进去发现while的作用