#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define rep(i,n) for(int i=0;i=0;i--) #define DREP(i,n) for(int i=n;i>0;i--) #define Rep(i,m,n) for(int i=m;i vi; typedef vector> vvi; typedef pair pdd; typedef pair pii; const double pi = acos(-1.0); double rad(double t){return t*pi/180.0;} double deg(double d){return d*180.0/pi;} templateT GCD(T x,T y){return y?GCD(y,x%y):x;} templateT LCM(T x,T y){return x/GCD(x,y)*y;} templateostream& operator<<(ostream& os,const set& s){os<<"{";for(auto itr=s.begin();s.end() != itr;++itr){if(itr!=s.begin())os<<',';os<<*itr;}os<<"}";return os;} templateostream& operator<<(ostream& os,const pair& p){os<<'('<> i); } return ret; } int solve(int n){ int infty=n+1; vi masu(infty,n+1); queue q; q.push(1); masu[1]=1; while(!q.empty()){ int pos = q.front(); q.pop(); int n1=pos+count(pos); int n2=pos-count(pos); if(n1<=n&&masu[n1]==infty){ masu[n1] = masu[pos] + 1; q.push(n1); } if(n2>=1&&masu[n2]==infty){ masu[n2] = masu[pos] + 1; q.push(n2); } if(masu[n]!=infty)return masu[n]; } return -1; } int main(){ int n; cin >> n; cout << solve(n) << endl; return 0; }