#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 atcoder; using namespace std; using ll = long long; #define all(A) A.begin(),A.end() using vll = vector; #define rep(i, n) for (long long i = 0; i < (long long)(n); i++) using Graph = vector>>; vector seen; bool C = true; vector dist; ll mod =1e9+7; int op(int a, int b) { return min(a, b); } int e() { return int(1e9); } int main() { ll N; cin >> N; ll an = 0; queue Q; vll AN(N,-1); Q.push(1); AN[0] = 1; while (!Q.empty()) { ll P = Q.front(); Q.pop(); ll K = P; ll M = 0; while (K > 0) { if (K % 2 != 0)M++; K /= 2; } if (P - M > 0) { if (AN[P - M - 1] == -1) { AN[P - M - 1] = AN[P - 1] + 1; Q.push(P - M); } } if (P + M <= N) { if (AN[P + M - 1] == -1) { AN[P + M - 1] = AN[P - 1] + 1; Q.push(P + M); } } } cout << AN[N - 1] << endl; }