小M的数组变换

121 阅读1分钟

问题描述 小M拿到一个数组,她可以进行多次操作,每次操作可以选择两个元素 ai和 aj​,并选择 ai​ 的一个因子 x,然后将 ai​ 变为 ai/x,并将 aj​ 变为 aj·x。她的目标是通过有限次操作,使得数组中的每个元素最多只包含一种素因子。 素因子的定义是:若 x 能被素数 p 整除,那么 p 是 x 的一个素因子。例如,12 的素因子有 2 和 3。 你的任务是判断是否有可能通过有限次操作,使数组中的每个元素最多只包含一种素因子。如果可以,输出 "Yes",否则输出 "No"。

那么这道题我们对数组中的每个数进行素因子分解, 然后统计出现过的素数的个数和n进行大小比较即可。

def solution(n: int, a: list) -> str:
    # write code here
    w = set()
    for x in a:
        i = 2
        y = x
        while i*i <= y:
            if y % i == 0:
                w.add(i)
                while y % i == 0:
                    y //= i
            i += 1
        if y != 1:
            w.add(y)
    return "Yes" if len(w) <= n else "No"