#include #include #include using namespace std; int N; //行ったことがあったら1 int dp[10000]; int getbit(int x); main(){ scanf("%d",&N); int step = 1; int point = 1; queue > q; q.push(make_pair(point,step)); while(!q.empty()){ // printf("%d ",point);// //ループ確定 point = q.front().first; step = q.front().second; q.pop(); if(point==N){ break; } if(dp[point-1]){ continue; } if(point + getbit(point) <= N){ //前にすすめる場合 dp[point-1] = 1; q.push(make_pair(point+getbit(point),step+1)); } if(point - getbit(point) > 0){ //後ろに進む dp[point-1] = 1; q.push(make_pair(point-getbit(point),step+1)); } } printf("%d",point==N?step:-1); return 0; } int getbit(int x){ return __builtin_popcountl(x); }