资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
给出一个正整数n,求一个和最大的序列a0,a1,a2,……,ap,满足n=a0>a1>a2>……>ap且ai+1是ai的约数,输出a1+a2+……+ap的最大值
输入格式
输入仅一行,包含一个正整数n
输出格式
一个正整数,表示最大的序列和,即a1+a2+……+ap的最大值
样例输入
10
样例输出
6
数据规模和约定
1<n<=10^6
样例说明
p=2
a0=10,a1=5,a2=1,6=5+1
# 这道题我的第一思路是DFS深度优先遍历将每一种因数遍历一遍,最后保留最大值
n = int(input())
maxs = 1
sums = 0
def dfs(num):
global sums, maxs
if num == 2 or num == 3: # 如果是2或3直接可以得出结果1,或者最后分解到2或3,加1即可
sums += 1
maxs = max(maxs, sums) # 每次得到最后结果后保留较大值
sums -= 1 # 计算结束后要减去1,以免影响向上返回计算其他路径的值
return
temp = 0 # 标记得到的两个因数中较大的,也可以判断是否是素数
for i in range(2, int(num / 2) + 1):
if num % i == 0:
temp = int(num / i)
if temp == i: # 如果得到的两个因数相同则直接加上后再加1
sums += (temp + 1)
maxs = max(maxs, sums)
sums -= (temp + 1)
return
# 正常情况就从大到小依次分解,此处是较大的因数
sums += temp
dfs(temp)
sums -= temp
# 另一个较小的因数
sums += i
dfs(i)
sums -= i
if temp == 0: # 此处temp如果为0,则说明没有分解出因数,该数是素数,则加1即可
sums += 1
maxs = max(maxs, sums)
sums -= 1
return
dfs(n)
print(maxs)