using System;
using System.Collections;
using System.Diagnostics;
namespace CodeIq
{
internal class Program
{
/// 各数値に対応するビットフラグ数のテーブル
private static Hashtable _bitCountTable;
///
/// Carol は特殊なすごろくをしようとしている。
///
/// 1からNの番号がふられている一直線に並べられているN個のマスがある。
/// 1から開始のマスとして、ゴールはNが書かれているマスとする。
///
/// その場に書かれている数字の2進数で表現した時の1のビット数 だけ「前」または「後」に進めることができる。
/// (1未満とN+1以上のマスには移動することは出来ない、正確にNにならないとゴールできない)
///
/// 自然数Nを与えられた時、ゴールに到達できる最短の移動数(開始のマスへも移動にカウントする)を求めてください。
/// 到達できない場合は-1を出力してください。
///
/// 開始のマスがすでにゴールになっている場合もあリます。
///
private static void Main()
{
var n = int.Parse( Console.ReadLine() );
//var n = 1333;
var moveCount = 1;
var finished = false;
var stack = new Stack();
var history = new Stack();
stack.Push( 1 );
history.Push( 1 );
var getBitCount = new Func( target =>
{
var bitCount = 0;
for( ; target > 0; target &= target - 1 )
bitCount++;
return bitCount;
} );
_bitCountTable = new Hashtable();
for( var i = 1; i < n; i++ )
_bitCountTable[i] = getBitCount( i );
// ゴールまでの経路を計算する
while( stack.Count > 0 )
{
var pos = (int)stack.Pop();
if( pos == n )
{
finished = true;
break;
}
moveCount++;
var backward = pos - (int)_bitCountTable[pos];
if( !history.Contains( backward ) && backward > 0 )
{
stack.Push( backward );
history.Push( backward );
}
var forward = pos + (int)_bitCountTable[pos];
if( !history.Contains( forward ) && forward <= n )
{
stack.Push( forward );
history.Push( forward );
}
}
Debug.Print( ( finished ? moveCount : -1 ).ToString() );
Console.WriteLine( finished ? moveCount : -1 );
}
}
}