#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; inline int toInt(string s) { int v; istringstream sin(s); sin >> v; return v; } template inline string toStr(T x) { ostringstream sout; sout << x; return sout.str(); } typedef vector vi; typedef vector vvi; typedef vector vs; typedef pair pii; typedef long long ll; #define ALL(a) (a).begin(),(a).end() #define RALL(a) (a).rbegin(),(a).rend() #define FOR(i,a,b) for(int i=(a);i<=(b);++i) #define REP(i,n) FOR(i,0,(n)-1) const double EPS = 1e-10; const double PI = acos(-1.0); const int INF = INT_MAX / 10; int bitnum(int n) { int res = 0; while (0 < n) { res += (n % 2); n /= 2; } return res; } int main() { int N; cin >> N; vi f(N+1, INF); f[1] = 1; int ans = -1; queue Q; Q.push(1); while (!Q.empty()) { int p = Q.front(); Q.pop(); if (p == N) { ans = f[p]; break; } int b = bitnum(p); int np1 = p + b; if (0 < np1 && np1 <= N && f[np1] == INF) { f[np1] = f[p] + 1; Q.push(np1); } int np2 = p - b; if (0 < np2 && np2 <= N && f[np2] == INF) { f[np2] = f[p] + 1; Q.push(np2); } } cout << ans << endl; return 0; }