#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 bt(N+1, 0); for(int i = 1;i < N+1;i++) bt[i] = bt[i&(i-1)]+1; vector dp(N+1, 0); dp[1] = 1; queue que; que.push(1); while(!que.empty()){ int n = que.front(); que.pop(); int bit = bt[n]; if(n-bit >= 1 && !dp[n-bit]) { dp[n-bit] = dp[n]+1; que.push(n-bit); } if(n+bit <= N && !dp[n+bit]) { dp[n+bit] = dp[n]+1; que.push(n+bit); } } if(!dp[N]) cout << -1 << endl; else cout << dp[N] << endl; // for(int i = 0;i < 10;i++){ // cout << steps[i] << endl; // } }