use std::io::{self, Read}; #[derive(Debug)] struct Input { n: usize, } fn next_token(cin_lock: &mut io::StdinLock) -> String { cin_lock .by_ref() .bytes() .map(|c| c.unwrap() as char) .skip_while(|c| c.is_whitespace()) .take_while(|c| !c.is_whitespace()) .collect::() } fn read_input(cin_lock: &mut io::StdinLock) -> Input { Input { n: next_token(cin_lock).parse().unwrap(), } } fn solve(input: &Input, _cin_lock: &mut io::StdinLock) { let mut counts = vec![None; input.n]; counts[0] = Some(1); let mut positions = vec![1]; while !positions.is_empty() { let p = positions.pop().unwrap(); let next_count = counts[p - 1].unwrap() + 1; let bits = p.count_ones() as usize; let can_shorten = |c| match c { Some(n) => next_count < n, None => true, }; if p + bits <= input.n { let next_p = p + bits; if can_shorten(counts[next_p - 1]) { counts[next_p - 1] = Some(next_count); positions.push(next_p); } } if p >= 1 + bits { let next_p = p - bits; if can_shorten(counts[next_p - 1]) { counts[next_p - 1] = Some(next_count); positions.push(next_p); } } } let answer = match counts[input.n - 1] { Some(a) => a as i32, None => -1, }; println!("{}", answer); } fn main() { let cin = io::stdin(); let mut cin_lock = cin.lock(); let input = read_input(&mut cin_lock); solve(&input, &mut cin_lock); }