#include #define REPP(i,n,m) for(int i=n;i<=m;i++) #define REPM(i,n,m) for(int i=n;i>=m;i--) #define VI vector using namespace std; void yn(bool f){if(f){cout<<"Yes\n";}else{cout<<"No\n";}} bool isnum(char c){return ('0'<=c&&c<='9');} int btcnt(int n){ int cnt=0; while(n!=0){ cnt+=(n&1); n>>=1; } return cnt; } int main(){ int n; cin>>n; if(n==1){ cout<<1; } else{ vector> adj(n+1); vector flag(n+1,false); deque queue; vector depthArray(n+1); int queuelen=1; bool solved=false; flag[1]=true; depthArray[1]=1; queue.push_front(1); for(int i=0;i<=n;i++){ if(n>=i+btcnt(i)&&i+btcnt(i)>0){ adj[i].push_back(i+btcnt(i)); } if(n>=i-btcnt(i)&&i-btcnt(i)>0){ adj[i].push_back(i-btcnt(i)); } } while(queuelen!=0&&!solved){ int v=queue.front(); queue.pop_front(); queuelen--; for(auto& u:adj[v]){ if(u==n){ solved=true; } if(!flag[u]){ flag[u]=true; queue.push_back(u); queuelen++; depthArray[u]=depthArray[v]+1; } } } if(solved){ cout<