#ifndef _GLIBCXX_NO_ASSERT #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#ifdef __GXX_EXPERIMENTAL_CXX0X__ #include #include #include #include #include #include #include #include //#endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include #include //#include #include //#include #include //#include #include #include #include #include //#include #include #include #include #include #include using namespace std; int main () { int N; cin >> N; vectordata ( N + 1 , INT_MAX ); queueque; que.push ( 1 ); data[1] = 1; for( size_t i = 0; i < 10 * N; i++ ) { if( data[N] != INT_MAX ) { cout << data[N] << endl; return 0; } if( que.empty () ) { cout << -1 << endl; return 0; } int now = que.front (); que.pop (); int count = 0; int now2 = now; while( now2 > 0 ) { count += now2 & 1; now2 >>= 1; } if( now + count < N + 1 ) { if( data[now + count] > data[now] + 1 ) { data[now + count] = data[now] + 1; que.push ( now + count ); } } if( now - count > 0 ) { if( data[now - count] > data[now] + 1 ) { data[now - count] = data[now] + 1; que.push ( now - count ); } } } cout << -1 << endl; return 0; }