// No.3 ビットすごろく #include #include #include #include using namespace std; const int INF = 1 << 30; int main() { int N; cin >> N; vector dp(N, INF); dp[0] = 1; priority_queue, vector>, greater>> que; que.push({1, 0}); while (!que.empty()) { auto [d, x] = que.top(); que.pop(); if (d > dp[x]) continue; int move = bitset<32>(x + 1).count(); if (x + move < N) { if (dp[x + move] > dp[x] + 1) { dp[x + move] = dp[x] + 1; que.push({dp[x + move], x + move}); } } if (x - move >= 0) { if (dp[x - move] > dp[x] + 1) { dp[x - move] = dp[x] + 1; que.push({dp[x - move], x - move}); } } } if (dp[N - 1] == INF) cout << -1 << endl; else cout << dp[N - 1] << endl; }