from collections import deque
def getMinOperations(n):
visited = set()
queue = deque([(n, 0)]) # (current_value, operations)
while queue:
num, steps = queue.popleft()
if num == 0:
return steps
if num in visited:
continue
visited.add(num)
i = 0
while (1 << i) <= n * 2: # try enough powers of 2
power = 1 << i
for next_num in (num - power, num + power):
if 0 <= next_num < (1 << 20) and next_num not in visited:
queue.append((next_num, steps + 1))
i += 1
print(getMinOperations(983017))
ZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKCmRlZiBnZXRNaW5PcGVyYXRpb25zKG4pOgogICAgdmlzaXRlZCA9IHNldCgpCiAgICBxdWV1ZSA9IGRlcXVlKFsobiwgMCldKSAgIyAoY3VycmVudF92YWx1ZSwgb3BlcmF0aW9ucykKICAgIAogICAgd2hpbGUgcXVldWU6CiAgICAgICAgbnVtLCBzdGVwcyA9IHF1ZXVlLnBvcGxlZnQoKQogICAgICAgIGlmIG51bSA9PSAwOgogICAgICAgICAgICByZXR1cm4gc3RlcHMKICAgICAgICBpZiBudW0gaW4gdmlzaXRlZDoKICAgICAgICAgICAgY29udGludWUKICAgICAgICB2aXNpdGVkLmFkZChudW0pCgogICAgICAgIGkgPSAwCiAgICAgICAgd2hpbGUgKDEgPDwgaSkgPD0gbiAqIDI6ICAjIHRyeSBlbm91Z2ggcG93ZXJzIG9mIDIKICAgICAgICAgICAgcG93ZXIgPSAxIDw8IGkKICAgICAgICAgICAgZm9yIG5leHRfbnVtIGluIChudW0gLSBwb3dlciwgbnVtICsgcG93ZXIpOgogICAgICAgICAgICAgICAgaWYgMCA8PSBuZXh0X251bSA8ICgxIDw8IDIwKSBhbmQgbmV4dF9udW0gbm90IGluIHZpc2l0ZWQ6CiAgICAgICAgICAgICAgICAgICAgcXVldWUuYXBwZW5kKChuZXh0X251bSwgc3RlcHMgKyAxKSkKICAgICAgICAgICAgaSArPSAxCgoKcHJpbnQoZ2V0TWluT3BlcmF0aW9ucyg5ODMwMTcpKQ==