首页 > 试题广场 >

kotori和素因子

[编程题]kotori和素因子
  • 热度指数:6616 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}kotori 拿到 n互不相同的正整数 a_1,a_2,\dots,a_n。她要从每个 a_i 中选出一个素因子 p_i,要求所有选出的素因子两两不同,即 p_i\neq p_j\;(i\neq j)

\hspace{15pt}若无法满足要求输出 -1;否则输出所有选出的素因子之和 \displaystyle\sum_{i=1}^{n}p_i 的最小可能值。

输入描述:
\hspace{15pt}第一行输入整数 n\left(1\leqq n\leqq 10\right)
\hspace{15pt}第二行输入 n 个两两不同的整数 a_i\left(2\leqq a_i\leqq 1000\right)


输出描述:
\hspace{15pt}若存在合法选取方案,输出最小可能和;否则输出 -1
示例1

输入

4
12 15 28 22

输出

17

说明

可取素因子 [3,5,7,2],和为 17;任意合法方案的和都不小于 17
示例2

输入

5
4 5 6 7 8

输出

-1

备注:

import collections
class Solution():
    def __init__(self, alist, n):
        self.alist = alist
        self.n = n
        self.res = float('+inf')
        self.dic = collections.defaultdict(list)
        self.no_repeat_set = set()

    def is_prime(self, x):
        if x <= 1:
            return False
        for i in range(2, x):
            if x % i == 0:
                return False
        return True
    
    def dfs(self, idx, s):
        if idx == self.n:
            self.res = min(self.res, s)
            return
        for prime_factor in self.dic[self.alist[idx]]:
            if prime_factor not in self.no_repeat_set:
                self.no_repeat_set.add(prime_factor)
                self.dfs(idx+1, s+prime_factor)
                self.no_repeat_set.remove(prime_factor)
    
    def func(self):
        if self.n <= 0:
            return -1
        for ele in self.alist:
            if ele == 1:
                return -1
            for i in range(2, ele+1):
                if self.is_prime(i) and ele % i == 0:
                    self.dic[ele].append(i)
            if self.dic[ele] == []:
                return -1
        self.dfs(0, 0)
        return -1 if self.res == float('+inf') else self.res


n = int(input().strip())
alist = list(map(int, input().strip().split()))
solution = Solution(alist, n)
print(solution.func())

发表于 2024-08-31 16:45:51 回复(0)

问题信息

难度:
2条回答 3136浏览

热门推荐

通过挑战的用户

查看代码
kotori和素因子