#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; } 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 ) { data[now + count] = min ( data[now] + 1 , data[now + count] ); que.push ( now + count ); } if( now - count > 0 ) { data[now - count] = min ( data[now] + 1 , data[now - count] ); que.push ( now - count ); } } cout << -1 << endl; return 0; }