use std::io; use std::io::prelude::*; use std::io::BufReader; use std::collections::vec_deque::VecDeque; fn run(args: &Vec) -> Vec { let n: u32 = args[0].parse().unwrap(); let mut queue: VecDeque<(u32, u32)> = VecDeque::new(); let mut visited = vec![false; (n + 1) as usize]; queue.push_back((1, 1)); while !queue.is_empty() { let (k, c) = queue.pop_front().unwrap(); if k == n { return vec!(c.to_string()); } let b = bits(k); let b1 = k - b; if b1 >= 1 && !visited[b1 as usize] { queue.push_back((b1, c + 1)); visited[b1 as usize] = true; } let b2 = k + b; if b2 <= n && !visited[b2 as usize] { queue.push_back((b2, c + 1)); visited[b2 as usize] = true; } } vec!["-1".to_string()] } fn bits(n: u32) -> u32 { let mut n = n; let mut c = 0; while n > 0 { if n & 1 == 1 { c += 1; } n = n >> 1; } c } fn main() { let args = lines(BufReader::new(io::stdin())); for line in run(&args) { println!("{}", line); } } fn lines(reader: BufReader) -> Vec { reader.lines().map(|l| l.unwrap()).collect() }