小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")