0023. 非盈数和
* * * *
拉格朗日计划
* * * *
非盈数和

完全数是指真约数之和等于自身的数。例如,$28=1+2+4+7+14$,因此28是完全数。

若n的真约数之和小于n,则称其为亏数。若n的真约数之和大于n,则称其为盈数。

由于12是最小的盈数(它的真约数之和为$1+2+3+4+6=16$),所以能够表示成两个盈数之和的最小数是24。用分析手段可得,所有大于28123的数都能表示成两个盈数之和。不过实际不能表示成两个盈数之和的数要小于这一上界。

求所有不能表示成两个盈数之和的正整数之和。

本题难度:



解答

对小于28124的每个自然数,与第21题类似,先用筛法求出并保存所有真约数之和,再从中挑选出盈数并两两求和,最后遍历1到28123,找出不在盈数和中的数即可。结果是$4179871$。

dSum=[1 for i in range(28124)]

for d in range(2,28124):
    for i in range(d+d,28124,d):
        dSum[i]+=d

abList=[i for i in range(12,28124) if dSum[i]>i]

s=set([i+j for i in abList for j in abList if i+j<28124])

print sum(i for i in range(1,28124) if i not in s)