#define _USE_MATH_DEFINES #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include typedef long long int ll; //#include using namespace std; ll gcd(ll a, ll b) { if (a < b)swap(a, b); if (b == 0)return a; return gcd(b, a % b); } int lcm(int a, int b) { return a * b / gcd(a, b); } int main() { int Q; Q = 1; //cin >> Q; while (Q--) { vectorc(10101); for (int i = 1; i < 10100; i++) { int x = i; while (x) { if (x % 2)c[i]++; x /= 2; } } int n; cin >> n; vectorf(n + 20,1e9); queue>p; p.push({ 1, 1 }); while (p.size()) { int a = p.front().first; int b = p.front().second; p.pop(); if (a == n) { cout << b << endl; return 0; } if (a - c[a] >= 0 && b + 1 < f[a - c[a]]) { p.push({ a - c[a],b + 1 }); f[a - c[a]] = b + 1; } if (a + c[a] <= n && b + 1 < f[a + c[a]]) { p.push({ a + c[a],b + 1 }); f[a + c[a]] = b + 1; } //cout << a << endl; } cout << -1; } return 0; }