#include #include #include #include #include #include #include #include #include #include #include #include #include #define p(s) cout<<(s)<=n;i--) #define CK(n,a,b) ((a)<=(n)&&(n)<(b)) #define F first #define S second typedef long long ll; using namespace std; const int inf=1e9+7; int N; int used[10010]; vector edge[10010]; int main(){ cin>>N; REP(i,1,N){ int n=__builtin_popcount(i); if(CK(i+n,1,N+1)){ edge[i].push_back(i+n); } if(CK(i-n,1,N+1)){ edge[i].push_back(i-n); } } REP(i,1,N+1){ used[i]=-1; } queue q; q.push(1); used[1]=1; while(!q.empty()){ int now=q.front();q.pop(); for(auto v:edge[now]){ if(used[v]!=-1) continue; used[v] = used[now] + 1; q.push(v); } } p(used[N]); return 0; }