#[macro_export] macro_rules! setup { { mut $input:ident: SplitWhitespace $(,)? } => { use std::io::Read; let mut buf = String::new(); std::io::stdin().read_to_string(&mut buf).unwrap(); let mut $input = buf.split_whitespace(); }; } #[macro_export] macro_rules! parse_next { ($str_iter:expr) => { $str_iter.next().unwrap().parse().unwrap() }; } use std::collections::VecDeque; fn main() { setup! { mut input: SplitWhitespace }; let n: usize = parse_next!(input); macro_rules! ones { ($i:expr) => { format!("{:#b}", $i).replace("0b", "").matches("1").count() }; } let nums = (1..=n).map(|i| i as usize).collect::>(); let ans = (|| { let mut queue = VecDeque::new(); let mut visited = vec![false; n * 2]; { queue.push_back(1); visited[0] = true; } let mut depth = 0; while !queue.is_empty() { depth += 1; let mut len = queue.len(); while len > 0 { let i = queue.pop_front().unwrap(); if i == n { return depth; } let mut children = vec![]; { let j = i + ones!(i); if nums.contains(&j) { children.push(j); } } { if !(i <= ones!(i)) { let j = i - ones!(i); if nums.contains(&j) { children.push(j); } } } for j in children.into_iter() { if !visited[j - 1] { queue.push_back(j); visited[j - 1] = true; } } len -= 1; } } return -1; })(); println!("{:?}", ans); }