from utils import divisors_up_to, window def are_consecutive(*nums): return nums == tuple(range(nums[0], nums[-1]+1)) divisors_by_number = divisors_up_to(1_000_000) numbers_and_prime_factors = { n: [f for f in factors if divisors_by_number[f] == [1]] for n, factors in divisors_by_number.items() } numbers_with_four_prime_factors = ( n for n, prime_factors in sorted(numbers_and_prime_factors.items()) if len(prime_factors) == 4 ) answer = next( a for a, b, c, d in window(numbers_with_four_prime_factors, 4) if are_consecutive(a, b, c, d) ) print(answer)
from utils import divisors_up_to divisors_by_number = divisors_up_to(28123) abundant_numbers = { n for n, divisors in divisors_by_number.items() if sum(divisors) > n } def is_sum_of_abundant_numbers(n): return any( (n-m) in abundant_numbers for m in abundant_numbers ) non_abundant_sums = ( n for n in divisors_by_number if not is_sum_of_abundant_numbers(n) ) answer = sum(non_abundant_sums) print(answer)