- 题意
给一个正整数
,将其进行因子不重复的分解,而且分解出的因子数要大于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))