#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define rep(i,n) for(int i=0;i<(n);i++) #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(), x.rend() #define sz(x) ((int)(x).size()) #define pb push_back #define mod 1000000007 using ll = long long; using namespace std; ll gcd(ll a, ll b) {return b?gcd(b,a%b):a;} ll lcm(ll a, ll b) {return a/gcd(a,b)*b;} int main(){ int N; cin >> N; vector> G(N+1); for(int i=1; i<=N; i++){ int cnt = 0; int now = i; rep(j, 20){ if(now&1) cnt++; now /= 2; } if(cnt == 0) continue; if(i+cnt<=N) G[i].pb(i+cnt); if(i-cnt>0) G[i].pb(i-cnt); } vector d(N+1,-1); queue q; q.push(1); d[1] = 1; while(!q.empty()){ int now = q.front(); q.pop(); rep(i,sz(G[now])){ if(d[G[now][i]]>=0) continue; q.push(G[now][i]); d[G[now][i]] = d[now]+1; } } cout << d[N] << endl; return 0; }