题解 | kotori和素因子
kotori和素因子
https://www.nowcoder.com/practice/7b1c858a3e7a41ed8364178979eaae67
def is_prime(number):
"""
判断一个数是否为质数
Args:
number: 需要判断的数字
Returns:
bool: 是否为质数
"""
if number < 2:
return False
# 只需要检查到平方根即可
for divisor in range(2, int(number ** 0.5) + 1):
if number % divisor == 0:
return False
return True
def find_minimum_prime_factors_sum(
current_index, used_factors, current_sum, numbers, min_sum
):
"""
使用深度优先搜索找出每个数的一个质因子,使得这些质因子互不相同且和最小
Args:
current_index: 当前处理的数字索引
used_factors: 已使用的质因子集合
current_sum: 当前已选质因子的和
numbers: 输入的数字列表
min_sum: 当前找到的最小和
Returns:
int: 找到的最小和,如果无解则返回float('inf')
"""
# 基础情况:所有数字都已处理完
if current_index == len(numbers):
return min(min_sum, current_sum)
current_number = numbers[current_index]
# 尝试当前数字的所有可能质因子
for factor in range(2, current_number + 1):
if (
current_number % factor == 0
and is_prime(factor)
and factor not in used_factors
):
# 选择这个质因子
used_factors.add(factor)
min_sum = find_minimum_prime_factors_sum(
current_index + 1, used_factors, current_sum + factor, numbers, min_sum
)
# 回溯:移除这个质因子
used_factors.remove(factor)
return min_sum
def main():
"""
主函数:处理输入并输出结果
"""
# 读取输入
n = int(input())
numbers = list(map(int, input().split()))
# 初始化参数
used_factors = set()
initial_min_sum = float("inf")
# 执行搜索
result = find_minimum_prime_factors_sum(
0, used_factors, 0, numbers, initial_min_sum
)
# 输出结果
if result == float("inf"):
print(-1)
else:
print(result)
main()
