#include using namespace std; struct Edge{ int to; long long w; Edge(int to, long long w): to(to), w(w){} }; using Gragh = vector>; Gragh G; int n; const int INF = 10800000; template bool chmin(T &a, T b){ if (b < a){ a = b; return true; }else{ return false; } } int main(){ cin >> n; G.resize(n + 1); for (int i = 1; i <= n; ++i){ int digi = __builtin_popcount(i); if (i - digi >= 1) G[i].push_back(Edge(i - digi,1)); if (i + digi <= n) G[i].push_back(Edge(i + digi,1)); } vector dist(n + 1, INF); dist[1] = 1; priority_queue, vector>, greater>> que; que.push(make_pair(dist[1], 1)); while (!que.empty()){ int cur = que.top().second; long long d = que.top().first; que.pop(); if (dist[cur] < d) continue; for (auto e: G[cur]){ if (chmin(dist[e.to], dist[cur] + e.w)){ que.push(make_pair(dist[e.to], e.to)); } } } if (dist[n] < INF) cout << dist[n] << endl; else cout << -1 << endl; }