#!/usr/bin/env python3 from functools import lru_cache from math import isqrt N=112 @lru_cache(None) def possible(T): B=set(T) S={x+y for x in B for y in B} if 113 in S:return False P={x*y for x in B for y in B} M=S-P if not M:return True def options(s): return [(u,s//u) for u in range(1,isqrt(s)+1) if s%u==0 and s//u<=N and (113-u) not in B and (113-s//u) not in B and u+s//u!=113] s=min(M,key=lambda v:len(options(v))) return any(possible(tuple(sorted(B|{u,v}))) for u,v in options(s)) print(possible((1,2,3,5,7)),possible.cache_info())