def valid_z1s(z2, w, c1, c2, c3): valid = {(z2 - w - c3) // 26} | {(z2 * 26 + i) for i in range(26)} for z1 in valid: if evolve(z1, w, c1, c2, c3) == z2: yield z1 def evolve(z, w, c1, c2, c3): return (z // c1) if (z % 26 + c2 == w) else (z * 26 + w + c3) consts = [] for block in open(0).read().split('inp w\n')[1:]: els = [ln.split()[-1] for ln in block.splitlines()] consts.append((int(els[3]), int(els[4]), int(els[14]))) valid_zs = {0: {0}} for c1, c2, c3 in consts[:7]: valid_zs[len(valid_zs)] = { evolve(z, w, c1, c2, c3) for z in valid_zs[len(valid_zs) - 1] for w in map(int, '123456789') } state = [('', 0)] idx = 14 for c1, c2, c3 in consts[::-1]: idx -= 1 state = [ (w + s, z1) for s, z2 in state for w in '123456789' for z1 in valid_z1s(z2, int(w), c1, c2, c3) if idx not in valid_zs or z1 in valid_zs[idx] ] (head, _), *body, (tail, _) = sorted(state) print(tail) print(head)