字节青训营小M的数组变换问题

79 阅读2分钟

问题描述

小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集合

image.png

参考链接 使用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的作用