#include #include using namespace std; long long INF = 1e9; int bfs(int n) { queue q; q.push(1); vectorroot(n + 1, INF); root[1] = 1; while (q.size()) { int now = q.front(); q.pop(); int bit = __builtin_popcount(now); //後ろに行けるとき if (now - bit > 0 && root[now - bit] == INF) { //最短でたどり着いた時の手数 root[now - bit] = root[now] + 1; //たどり着けた場所をqueueに入れる q.emplace(now - bit); } //前に行けるとき if (now + bit <= n && root[now + bit] == INF) { root[now + bit] = root[now] + 1; q.emplace(now + bit); } } if (root[n] == INF)return -1; else return root[n]; } //dist[n]には始点からの最短距離が入っている int main() { int n; cin >> n; cout << bfs(n) << endl; }