use std::io::Read; fn main() { let mut buf = String::new(); std::io::stdin().read_to_string(&mut buf).unwrap(); let n: usize = buf.trim().parse().unwrap(); let mut positions: Vec = vec![1]; let mut is_checked: Vec = vec![false; n+1]; is_checked[1] = true; let mut layer: usize = 1; let mut answer: Option = None; while !positions.is_empty() { if is_checked[n] { answer = Some(layer); break; } let mut new_positions: Vec = vec![]; for p in positions.iter() { let ones: usize = p.count_ones() as usize; let f: usize = p + ones; let b: usize = p.saturating_sub(ones); if f > 1 && f <= n && !is_checked[f] { new_positions.push(f); is_checked[f] = true; } if b > 1 && b <= n && !is_checked[b] { new_positions.push(b); is_checked[b] = true; } } layer += 1; positions = new_positions; } if let Some(a) = answer { println!("{}", a); } else { println!("-1") } }