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