import itertools from typing import Any, Iterator from ..base import BaseSolver def presents(n: int, elf: int, max: int) -> int: count = 0 k = 1 while k * k < n: if n % k == 0: if n // k <= max: count += elf * k if k <= max: count += elf * (n // k) k += 1 if k * k == n and k <= max: count += elf * k return count class Solver(BaseSolver): def solve(self, input: str) -> Iterator[Any]: target = int(input) yield next(n for n in itertools.count(1) if presents(n, 10, target) >= target) yield next(n for n in itertools.count(1) if presents(n, 11, 50) >= target)