use std::io; fn num2bin(p: u32) -> u32 { let mut cnt = 0u32; let mut x = p; while x > 0 { cnt += x & 1; x = x >> 1; } cnt } fn judge(p: i32, max: i32, arr: &Vec) -> i32 { let mut vec = Vec::new(); vec.extend_from_slice(&arr); vec.sort(); if p == max { return 1; } else if p < 1 || max < p { return -1; } match vec.binary_search(&p) { Ok(_) => {return -1}, Err(_) => { let inc = num2bin(p as u32); let inc = inc as i32; vec.push(p); let mut ret1 = judge(p+inc, max, &vec); let mut ret2 = judge(p-inc, max, &vec); if ret1 > 0 && ret2 > 0 { return std::cmp::min(ret1, ret2) + 1; } else if ret1 > 0 && ret2 < 0 { return ret1 + 1; } else if ret2 > 0 { return ret2 + 1; } else { return -1; } }, } -1 } fn main() { let mut num = String::new(); io::stdin().read_line(&mut num).ok().expect("ERROR"); let num: i32 = num.trim().parse().ok().expect("ERROR"); let ret = judge(1, num, &Vec::new()); if ret > 0 { println!("{}", ret); } else { println!("-1"); } }