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 List (); var queue = new Queue (); queue.Enqueue (new Pair(1, 0)); while (queue.Count > 0) { var x = queue.Dequeue(); if (x.Item == N) { Console.WriteLine(x.Distance + 1); return; } done.Add(x.Item); foreach(var y in this.neiboughrNodes(N, x.Item)){ if (!done.Contains(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(); } } }