import math items = (int(x.strip()) for x in open("input.txt")) values = {(2020, 3)} tree = dict() def tree_up(idx, step=1, offset = 0): print(idx, step) nxt = tree[(idx, step)] if (idx, step) in tree else None appendix = [] if nxt is None else tree_up(nxt+idx, step=step+1, offset=idx) return [idx - offset] + appendix for item in items: tmp_values = set(values) for elem in values: new = (elem[0] - item, elem[1]-1) if new == (0, 0): vals = tree_up(item) print("Found [{}]: Sum={}, Product={}".format( ", ".join(map(str, vals)), sum(vals), math.prod(vals) )) exit() elif new[0] < 0 or new[1] < 0: # target value too low or to many sums continue else: tree[new] = item tmp_values.add(new) values = tmp_values