#include<iostream>
using namespace std;
#define REP(i,b,n) for(int i=b;i<n;i++)
#define rep(i,n)   REP(i,0,n)
typedef unsigned long long ull;

int tmp_cost(int p){
  if( p==1)return 0;
  int ret=tmp_cost(p/2)+1+p%2;
  return ret;
}

ull expect(int p,int n,ull tar){
  ull ret=n;
  while(p--&&ret<tar)ret+=ret;
  return ret;
}

int ans;
bool solve(int cnt,int limit,int now,int tar,int num,int *made,bool *visited){
  if (cnt>limit)return false;
  if ( now>=tar*2)return false;//may not be need?
  
  if (now == tar ){
    ans=min(ans,cnt);
    return true;
  }
  if ( cnt==limit)return false;

  int findmax=0;
  REP(i,0,num)findmax=max(findmax,made[i]);
  if( expect(limit-cnt,findmax,(ull)tar)<(ull)tar){
    return false;
  }



  for(int i=num-1;i>=0;i--){
    //mul
    if ( visited[now+made[i]]==false){
      visited[now+made[i]]=true;
      made[num]=now+made[i];
      if (solve(cnt+1,limit,now+made[i],tar,num+1,made,visited)){
	visited[now+made[i]]=false;
	return true;
      }
      visited[now+made[i]]=false;
    }


    //div
    if( now-made[i]>0 && visited[now-made[i]]==false){
      visited[now-made[i]]=true;
      made[num]=now-made[i];
      if (solve(cnt+1,limit,now-made[i],tar,num+1,made,visited)){
	visited[now-made[i]]=false;
	return true;
      }
      visited[now-made[i]]=false;
    }


  }

  return false;
}

int main(){
  int n;
  while(cin>>n&&n){
    int upper=tmp_cost(n);
    bool visited[5002]={false};
    int  made[30];
    visited[1]=true;
    visited[2]=true;
    made[0]=1;
    made[1]=2;
        
    
    int lower=0,tmp=1;
    while(tmp<n){
      tmp*=2;
      lower++;
    }
    
    for(int i=upper-1;i>=lower;i--){
      ans=i;
      if (solve(1,i,2,n,2,made,visited) ){
	//cout << "solved at " <<i<<" with " << ans << endl;
	upper=ans;
	i=ans;
      }
      //else cout << "unsolved at " <<i<<endl;

    }
    cout << upper << endl;

  }
  return false;
}
### Prompt

Please provide a CPP coded solution to the problem described below:

Starting with x and repeatedly multiplying by x, we can compute x31 with thirty multiplications:

x2 = x × x, x3 = x2 × x, x4 = x3 × x, ... , x31 = x30 × x.

The operation of squaring can appreciably shorten the sequence of multiplications. The following is a way to compute x31 with eight multiplications:

x2 = x × x, x3 = x2 × x, x6 = x3 × x3, x7 = x6 × x, x14 = x7 × x7,
x15 = x14 × x, x30 = x15 × x15, x31 = x30 × x.

This is not the shortest sequence of multiplications to compute x31. There are many ways with only seven multiplications. The following is one of them:

x2 = x × x, x4 = x2 × x2, x8 = x4 × x4, x10 = x8 × x2,
x20 = x10 × x10, x30 = x20 × x10, x31 = x30 × x.

There however is no way to compute x31 with fewer multiplications. Thus this is one of the most eficient ways to compute x31 only by multiplications.

If division is also available, we can find a shorter sequence of operations. It is possible to compute x31 with six operations (five multiplications and one division):

x2 = x × x, x4 = x2 × x2, x8 = x4 × x4, x16 = x8 × x8, x32 = x16 × x16,
x31 = x32 ÷ x.

This is one of the most eficient ways to compute x31 if a division is as fast as a multiplication.

Your mission is to write a program to find the least number of operations to compute xn by multiplication and division starting with x for the given positive integer n. Products and quotients appearing in the sequence of operations should be x to a positive integer's power. In other words, x-3, for example, should never appear.



Input

The input is a sequence of one or more lines each containing a single integer n. n is positive and less than or equal to 1000. The end of the input is indicated by a zero.

Output

Your program should print the least total number of multiplications and divisions required to compute xn starting with x for the integer n. The numbers should be written each in a separate line without any superfluous characters such as leading or trailing spaces.

Example

Input

1
31
70
91
473
512
811
953
0


Output

0
6
8
9
11
9
13
12

### Response

```cpp
#include<iostream>
using namespace std;
#define REP(i,b,n) for(int i=b;i<n;i++)
#define rep(i,n)   REP(i,0,n)
typedef unsigned long long ull;

int tmp_cost(int p){
  if( p==1)return 0;
  int ret=tmp_cost(p/2)+1+p%2;
  return ret;
}

ull expect(int p,int n,ull tar){
  ull ret=n;
  while(p--&&ret<tar)ret+=ret;
  return ret;
}

int ans;
bool solve(int cnt,int limit,int now,int tar,int num,int *made,bool *visited){
  if (cnt>limit)return false;
  if ( now>=tar*2)return false;//may not be need?
  
  if (now == tar ){
    ans=min(ans,cnt);
    return true;
  }
  if ( cnt==limit)return false;

  int findmax=0;
  REP(i,0,num)findmax=max(findmax,made[i]);
  if( expect(limit-cnt,findmax,(ull)tar)<(ull)tar){
    return false;
  }



  for(int i=num-1;i>=0;i--){
    //mul
    if ( visited[now+made[i]]==false){
      visited[now+made[i]]=true;
      made[num]=now+made[i];
      if (solve(cnt+1,limit,now+made[i],tar,num+1,made,visited)){
	visited[now+made[i]]=false;
	return true;
      }
      visited[now+made[i]]=false;
    }


    //div
    if( now-made[i]>0 && visited[now-made[i]]==false){
      visited[now-made[i]]=true;
      made[num]=now-made[i];
      if (solve(cnt+1,limit,now-made[i],tar,num+1,made,visited)){
	visited[now-made[i]]=false;
	return true;
      }
      visited[now-made[i]]=false;
    }


  }

  return false;
}

int main(){
  int n;
  while(cin>>n&&n){
    int upper=tmp_cost(n);
    bool visited[5002]={false};
    int  made[30];
    visited[1]=true;
    visited[2]=true;
    made[0]=1;
    made[1]=2;
        
    
    int lower=0,tmp=1;
    while(tmp<n){
      tmp*=2;
      lower++;
    }
    
    for(int i=upper-1;i>=lower;i--){
      ans=i;
      if (solve(1,i,2,n,2,made,visited) ){
	//cout << "solved at " <<i<<" with " << ans << endl;
	upper=ans;
	i=ans;
      }
      //else cout << "unsolved at " <<i<<endl;

    }
    cout << upper << endl;

  }
  return false;
}
```