use std::io::{self, BufReader, BufWriter, Read, Write}; fn main() { let stdin = io::stdin(); let mut stdin = BufReader::new(stdin.lock()); let stdout = io::stdout(); let mut stdout = BufWriter::new(stdout.lock()); let mut buf = String::new(); stdin.read_to_string(&mut buf).unwrap(); let n: usize = buf.trim_end().parse().unwrap(); match search(n) { Some(i) => writeln!(&mut stdout, "{}", i).unwrap(), None => writeln!(&mut stdout, "-1").unwrap(), }; } fn search(n: usize) -> Option { let mut visited = vec![0; n + 1]; let mut queue = Vec::new(); visited[1] = 1; queue.push(1); while let Some(v) = queue.pop() { if v == n { return Some(visited[v]); } let i = v.count_ones() as usize; let left = v as i32 - i as i32; let right = v + i; if left > 0 { let left = left as usize; if visited[left] == 0 { visited[left] = visited[v] + 1; queue.push(left); } } if right <= n { if visited[right] == 0 { visited[right] = visited[v] + 1; queue.push(right); } } } return None; }