#include using namespace std; map route; // ビットを数える・探すアルゴリズム. // http://www.nminoru.jp/~nminoru/programming/bitcount.html int countBits(int bits){ int num; num = (bits >> 1) & 03333333333; num = bits - num - ((num >> 1) & 03333333333); num = ((num + (num >> 3)) & 0707070707) % 077; return num; } // 経路情報更新. // @param bef: 前回地点. // @param dep: 経路の深さ. // @param cur: 現在地点. // @param limit: 経路の上限. // @return: 特に無し. void update(int bef, int dep, int cur, int limit){ // 1. 現在地点が, 到達可能な経路から, はみ出していたら終了. if(cur > limit) return; if(cur < 1) return; // 2. 経路長が, limit の 2倍を超えていたら終了. if(dep > limit * 2) return; // 3. すでに経路情報が更新されていたら終了. if(route[cur] > 0) return; // 4. 現在地点の経路情報を更新. if(cur > bef && route[cur] == 0) route[cur] = dep; // 5. 現在地点 cur の 1のビット数をカウント. int bit = countBits(cur); // cout << "cur= " << cur << " dep=" << dep << " bit=" << bit << " limit=" << limit << endl; // 6. 終了確認. if(cur == limit) return; // 7. 次の経路情報へ. update(cur, dep + 1, cur + bit, limit); update(cur, dep + 1, cur - bit, limit); } int main() { // 1. 入力情報取得. int N; cin >> N; // 2. N以下の数について, 経路を確認していく. route[1] = 0; update(1, 1, 1, N); // 3. 後処理. int ans = -1; if(route.count(N) > 0) ans = route[N]; cout << ans << endl; return 0; }