#include #include #include #include #include #include #include #include #include using namespace std; #define REP(i,n) for(int i=0;i pii; typedef vector vi; typedef vector vvi; int N; int one[10001]; int used[10001]; int cntone(int n){ int cnt=0; while(n>0){ if(n%2) cnt++; n/=2; } return cnt; } int main(){ cin >> N; REP(i,10001) one[i] = cntone(i); REP(i,10001) used[i] = INF; used[1] = 1; queue que; que.push(1); while(!que.empty()){ int p = que.front(); que.pop(); if(p+one[p]>=1 and p+one[p]<=N){ if(used[p+one[p]] > used[p]+1){ used[p+one[p]] = used[p]+1; que.push(p+one[p]); } } if(p-one[p]>=1 and p-one[p]<=N){ if(used[p-one[p]] > used[p]+1){ used[p-one[p]] = used[p]+1; que.push(p-one[p]); } } } if(used[N]==INF) cout << -1 << endl; else cout << used[N] << endl; return 0; }