#include using namespace std; int N; int calcbit(int num){ int result=0; do{result+=(num%2); num/=2; }while(num); return result; } int main(){ int carol[10001]={0,1}; int checksheet[10001]={0,1}; int num,flag; cin >> N; do{ flag=0;//flag whether we got a shorter root for(int i=1;i<=N;i++){ if(checksheet[i]){//if we can go to i with a exist root num=calcbit(i); //--------------- if((i+num)<=N){//from the place we are, can go to the next place if(checksheet[i+num]){// [from] root to the place we can go has existed if(carol[i+num]>(carol[i]+1)){//but new is smaller carol[i+num]=carol[i]+1; flag=1; } } else{// [to] do not existed carol[i+num]=carol[i]+1; flag=1; checksheet[i+num]=1; } } //--------------- if((i-num)>1){//from the place we are, can go to the next place if(checksheet[i-num]){// [from] root to the place we can go has existed if(carol[i-num]>(carol[i]+1)){//but new is smaller carol[i-num]=carol[i]+1; flag=1; } } else{// [to] do not existed carol[i-num]=carol[i]+1; flag=1; checksheet[i-num]=1; } } } } }while(flag); if(checksheet[N])cout << carol[N] << endl; else cout << "-1" << endl; }