using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Application { class MainClass { public static void Main (string[] args) { new MainClass ().Calc (); } public MainClass () { } private class Pair { public readonly int Distance; public readonly int Item; public Pair (int n, int d) { this.Item = n; this.Distance = d; } } public void Calc () { var scan = new Scanner (); var N = scan.NextDigit (); var done = new Dictionary (); var queue = new Queue (); queue.Enqueue (new Pair (1, 1)); while (queue.Count > 0) { var x = queue.Dequeue (); if (x.Item == N) { Console.WriteLine (x.Distance); return; } if (!done.ContainsKey(x.Item)) { done.Add(x.Item, 0); foreach (var y in this.neiboughrNodes(N, x.Item)) { if (!done.ContainsKey(y)) queue.Enqueue(new Pair(y, x.Distance + 1)); } } } Console.WriteLine (-1); } List neiboughrNodes (int N, int i) { var b1 = bit (i); var res = new List (); if (i + b1 <= N) res.Add (i + b1); if (i - b1 > 1) res.Add (i - b1); return res; } int bit (int i) { var c = 0; while (i > 0) { if ((i & 1) > 0) c++; i = i >> 1; } return c; } void WriteLine (object o) { System.Console.WriteLine (o.ToString ()); } void WriteEnum (IEnumerable l) { WriteLine (JoinList (l)); } string JoinList (IEnumerable l) { return string.Join (" ", l.Select (x => x.ToString ()).ToArray ()); } } class Scanner { public int[] NextDigits (int count) { return Enumerable.Range (0, count) .Select (x => NextDigit ()).ToArray (); } public string NextToken () { int i; var r = new List (); while ((i = System.Console.Read()) >= 0) { var c = Convert.ToChar (i); if (IsSpace (c) && r.Count > 0) break; r.Add (c); } return new string (r.ToArray ()); } bool IsSpace (char c) { if (char.IsWhiteSpace (c)) return true; return false; } public int NextDigit () { var token = NextToken (); return int.Parse (token); } } class Reader { public string Item () { return Items () [0]; } public String[] Items () { return this.Items (' '); } public String[] Items (char c) { return System.Console.ReadLine ().Split (c); } public int Int () { return Ints (' ') [0]; } public int[] Ints () { return this.Ints (' '); } public int[] Ints (char c) { return Items (c).Select (x => int.Parse (x)).ToArray (); } } }