小M的数组变换-题解.py

295 阅读2分钟

小M的数组变换

问题描述

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

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

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


测试样例

样例1:

输入:n = 4 ,a = [1, 2, 3, 4]
输出:'Yes'

样例2:

输入:n = 2 ,a = [10, 12]
输出:'No'

样例3:

输入:n = 3 ,a = [6, 9, 15]
输出:'Yes'

思路

发现要求是使数组中的每个元素最多只包含一种素因子,而且他们可以任意交换因子那么我们可以考虑对每个数进行素因子拆分,对于相同的素因子给一个数里,那么我们只需要开个集合维护素因子种类的个数即可,当我们的不同种素因子的个数小于等于数组长度时,就是答案;

code

def is_prime(n):
    
    if n <= 1:
        return False
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False
    return True

def prime_dec(x):

    factors = []

    divisor = 2
    while x > 1:
  
        while x % divisor == 0:
            factors.append(divisor)
            x //= divisor
        divisor += 1
   
        while not is_prime(divisor):
            divisor += 1
    return factors

def solution(a:int , s:list)->str:
    mp={}
    
    for i in s:
        for j in prime_dec(i):
            if j in mp:
                mp[j]+=1
            else:
                mp[j]=1
    
    if len(mp) <= a:
        return "Yes"
    else:
        return "No"
        
            
if __name__ == '__main__':
    print(solution(4, [1, 2, 3, 4]) == "Yes")
    print(solution(2, [10, 12]) == "No")
    print(solution(3, [6, 9, 15]) == "Yes")