#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // C++ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #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::std; vector steps(10001, 0); void dfs(int N, int n, int step){ steps[n] = step; int bit = 0; for(int i = 0;i < 20;i++){ bit += ((n >> i) & 1); } if(n-bit >= 1 && (step+1 < steps[n-bit] || !steps[n-bit])) dfs(N, n-bit, step+1); if(n+bit <= N && (step+1 < steps[n+bit] || !steps[n+bit])) dfs(N, n+bit, step+1); } int main(){ int N; cin >> N; // dfs(N, 1, 1); vector dp(N+1, 0); queue> que; que.push(make_pair(1, 1)); while(!que.empty()){ pair q = que.front(); que.pop(); int n = q.first; int step = q.second; dp[n] = step; int bit = 0; for(int i = 0;i < 20;i++) bit += (n >> i) & 1; if(n-bit >= 1 && !dp[n-bit]) que.push(make_pair(n-bit, step+1)); if(n+bit <= N && !dp[n+bit]) que.push(make_pair(n+bit, step+1)); } if(!dp[N]) cout << -1 << endl; else cout << dp[N] << endl; // for(int i = 0;i < 10;i++){ // cout << steps[i] << endl; // } }