/* * Author: srtry * Created: 2025-05-05T02:26:22+09:00 * Coding: utf-8-unix */ use proconio::input; use std::io::{stdout,Write,BufWriter}; use std::collections::VecDeque; fn main() { input!{ n:usize } let out = stdout(); let mut out = BufWriter::new(out.lock()); let mut dp:Vec> = vec![None;n+1]; let mut set:VecDeque = VecDeque::from([1]); dp[1] = Some(1); let mut pos:Option; loop { pos = set.pop_front(); match pos { Some(x) => { let step:usize = x.count_ones() as usize; if x+step <= n { match dp[x+step] { None => { dp[x+step] = Some(dp[x].unwrap() + 1); set.push_back(x+step); if x+step == n { break; } }, Some(_) => (), } } if x-step > 0 { match dp[x-step] { None => { dp[x-step] = Some(dp[x].unwrap() + 1); set.push_back(x-step); if x-step == n { break; } }, Some(_) => (), } } }, None => break, } } match dp[n] { Some(x) => write!(out, "{}", x).unwrap(), None => write!(out, "-1").unwrap(), } }