using System; using System.Collections.Generic; using System.Text; using sc = Scanner; using System.Collections; using System.Linq; class Program { static void Main(string[] args) { Solve(); #if DEBUG Console.WriteLine("終了するにはなにかキーを押して下さい..."); Console.ReadKey(); #endif } static void Solve() { int n = sc.NextInt(); bool[]alreadyReached = new bool[n+1]; Queue sim = new Queue(); sim.Enqueue(new int[]{1,0}); alreadyReached[1] = true; while (sim.Count != 0) { int[] tmp = sim.Dequeue(); #if DEBUG Console.Write(tmp[0]); Console.Write(" "+tmp[1]); Console.WriteLine(); #endif int moveCount = 0; for (int i = 1; i < 10000; i =i*2) { if ((tmp[0] & i) != 0) { moveCount++; } } #if DEBUG Console.WriteLine(moveCount); #endif if (tmp[0]+ moveCount == n) { Console.WriteLine(tmp[1]+1+1); return; } if (tmp[0] - moveCount > 1 && !alreadyReached[tmp[0] - moveCount]) { alreadyReached[tmp[0] - moveCount] = true; sim.Enqueue(new int[]{tmp[0] - moveCount,tmp[1]+1} ); } if (tmp[0]+ moveCount < n+1 && !alreadyReached[tmp[0] + moveCount]) { alreadyReached[tmp[0] + moveCount] = true; sim.Enqueue(new int[]{tmp[0]+ moveCount,tmp[1]+1}); } } Console.WriteLine(-1); #if DEBUG Console.WriteLine("local check"); // Visual Studioのローカル変数チェック用 MainにいくとSolve内のローカル変数消えちゃう #endif } } public static class Scanner { public static string[] NextStrArray() { return Console.ReadLine().Split(' '); } public static long[] NextLongArray() { string[] s = NextStrArray(); long[] a = new long[s.Length]; for (int i = 0; i < a.Length; i++) { a[i] = long.Parse(s[i]); } return a; } public static int[] NextIntArray() { string[] s = NextStrArray(); int[] a = new int[s.Length]; for (int i = 0; i < a.Length; i++) { a[i] = int.Parse(s[i]); } return a; } public static int NextInt() { string tmp = ""; while (true) { string readData = char.ConvertFromUtf32(Console.Read()); if (readData == " " || readData == "\n") break; tmp += readData; } return int.Parse(tmp); } public static double NextDouble() { string tmp = ""; while (true) { string readData = char.ConvertFromUtf32(Console.Read()); if (readData == " " || readData == "\n") break; tmp += readData; } return double.Parse(tmp); } public static long NextLong() { string tmp = ""; while (true) { string readData = char.ConvertFromUtf32(Console.Read()); if (readData == " " || readData == "\n") break; tmp += readData; } return long.Parse(tmp); } public static double[] NextDoubleArray() { string[] s = NextStrArray(); double[] a = new double[s.Length]; for (int i = 0; i < a.Length; i++) { a[i] = double.Parse(s[i]); } return a; } }