import heapq import math def appr_lim(n): l10 = math.log(10.0) x = 4 * n * math.log(n) for _ in range(4): x = (l10 + n * (math.log(9 * x) - 1)) / (l10 - n / x) k = math.ceil(x) #print("appr_lim", n, k) assert (k > n) assert (10**k > 10 * (9*k)**n) return k def sum_digits(n): cnt = 0 res = 0 while n: res += n % 10 cnt += 1 n //= 10 return (res, cnt) h = [(4, 2, 2)] lims = [1, 2, appr_lim(2)] seq = [] def step(): v = heapq.heappop(h) x = v[0] n = v[1] a = v[2] sd = sum_digits(x) if (sd[0] == a): print(v) seq.append(x) if (1 * sd[1] < lims[n]): heapq.heappush(h, ((a + 1)**n, n, a+1)) if (a == 2): heapq.heappush(h, (2**(n+1), n+1, 2)) lims.append(appr_lim(n + 1)) while (len(seq) < 100): step()