• 题意

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