D题 (python3)
拜托了,牛老师
https://ac.nowcoder.com/acm/contest/7009/D
- 题意
给一个正整数
,将其进行因子不重复的分解,而且分解出的因子数要大于1,使得这些因子的和最小,求最小和。
- 思路
贪心。
def div(x): # 分解质因数,特判只能分解成一个质因数的平方的x,跟素数归为一类
ret = []
for i in range(2,int(x**0.5)): #
cnt = 0
if x%i != 0: continue
while x%i==0:
cnt += 1
x //= i
ret.append([i,cnt])
if x != 1:
ret.append([x, 1])
if len(ret)==1 and ret[0][1]<=2: # x = p^2这样的数分解方式跟素数是一样的
ret.append([1,1])
return ret
def adjust(ar): # 拆出尽可能多的因数
for i in range(len(ar)):
nw = 2
while ar[i][1] > nw:
ar.append([int(ar[i][0]**nw), 1])
ar[i][1] -= nw
nw += 1
return ar
n = eval(input())
a = adjust(div(n))
# 把多余的因数单独取出来放到一个数组que里,从大到小排序
que = []
for i in range(len(a)):
while a[i][1]>1:
que.append(a[i][0])
a[i][1] -= 1
que.sort(reverse=1)
a = set([p for p,t in a])
# 每次从数组que里取出一个最大的数,与a中尽可能小的因子结合,
# 确保结合后新因子不会跟其他因子重复
for val in que:
tmp = a.copy()
low = min(tmp)
while low*val in tmp:
tmp -= {low}
low = min(tmp)
a -= {low}
a |= {low*val}
print(sum(a))
查看13道真题和解析