# -*- coding: utf-8 -*-
"""A perfect number is a number for which the sum of its proper divisors
is exactly equal to the number. For example, the sum of the proper
divisors of 28 would be 1 + 2 + 4 + 7 + 14 = 28, which means that 28
is a perfect number.
A number n is called deficient if the sum of its proper divisors is
less than n and it is called abundant if this sum exceeds n.
As 12 is the smallest abundant number, 1 + 2 + 3 + 4 + 6 = 16, the
smallest number that can be written as the sum of two abundant numbers
is 24. By mathematical analysis, it can be shown that all integers
greater than 28123 can be written as the sum of two abundant
numbers. However, this upper limit cannot be reduced any further by
analysis even though it is known that the greatest number that cannot
be expressed as the sum of two abundant numbers is less than this
limit.
Find the sum of all the positive integers which cannot be written as
the sum of two abundant numbers.
"""
import itertools
def divisor(n):
d = 1
# we only need to search
# n/2+1 for a divisor
while d < (n / 2 + 1):
if n % d == 0:
yield d
d += 1
def main():
n = m = 28213
# get all redundants
redundants = []
while m > 0:
if sum(divisor(m)) > m:
redundants.append(m)
m -= 1
# remove all possible combos when a,b are both redundants
# and a != b
possible_sums = set([
sum((x, y)) for (x, y) in itertools.combinations(redundants, 2) if sum((x, y)) <= n])
results = set(range(1, n + 1)) - set(possible_sums)
# remove all combos when a,b are both redundants
# and a == b
results = results - set([2 * x for x in redundants if 2 * x <= n])
# what's left are numbers meeting the test criteria
print sum(results)
if __name__ == '__main__':
main()