#include constexpr int inf = 100000; using nowPoint = int; using nowMove = int; using namespace std; int main (void) { int N; cin >> N; vector masu(N + 1); for (int i = 0; i < N + 1; i++) masu[i] = __builtin_popcount(i); vector visited(N + 1, false); queue> q; q.push(make_pair(1, 1)); int ans = inf; while (!q.empty()) { nowPoint now_point; nowMove now_move; tie(now_point, now_move) = q.front(); q.pop(); // cerr << now_point << ", " << now_move << endl; if (visited[now_point]) continue; visited[now_point] = true; if (now_point == N) { ans = min(ans, now_move); continue; } for (const auto& next : {now_point + masu[now_point], now_point - masu[now_point]}) { if (next <= 0 || next > N) continue; q.push(make_pair(next, now_move + 1)); } } if (ans == inf) { cout << -1 << endl; } else { cout << ans << endl; } return 0; }