#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define all(x) (x).begin(),(x).end() #define rep(i,m,n) for(int i = m;i < n;++i) #define pb push_back #define fore(i,a) for(auto &i:a) #define rrep(i,m,n) for(int i = m;i >= n;--i) #define INF INT_MAX/2 using namespace std; using ll = long long; using R = double; const ll inf = 1LL << 50; const ll MOD = 1e9 + 7; struct edge { ll from; ll to; ll cost; }; int used[10101]; int dist[10101]; int f(int x) { int ret = 0; while (x > 0) { ret += (x % 2 == 1); x /= 2; } return ret; } int bfs(int g) { memset(dist, -1, sizeof(dist)); dist[1] = 1; queueque; que.push(1); while (que.size()) { int now = que.front(); que.pop(); if (now == g)break; int to_1 = now + f(now); int to_2 = now - f(now); if (1 <= to_1 && to_1 <= g && dist[to_1] == -1) { que.push(to_1); dist[to_1] = dist[now] + 1; } if (1 <= to_2 && to_2 <= g && dist[to_2] == -1) { que.push(to_2); dist[to_2] = dist[now] + 1; } } return dist[g]; } int main(){ int n; cin >> n; cout << bfs(n) << endl; return 0; }