#include #include #include #define NODE 1000 #define SIZE 1000 /* Queue */ int path[SIZE][NODE]; int length[SIZE]; int root[NODE]; int ans[2]; int bitCount( int bit); int search( int start, int goal); int b_search( int *array, int target, int size); void quick_sort( int *array, int left, int right); void change(int &a, int &b); int main(void) { int n, i; scanf("%d", &n); search(1, n); if(ans[1] != NULL) { printf("%d\n", ans[1]+2); } else { printf("-1"); } return 0; } int search(int start, int goal) { int rear = 1, front = 0, root_cnt = 1; path[0][0] = start; length[0] = 0; root[0] = start; while( front < rear ) { int len = length[front]; int node = path[front][len]; int i, bit = bitCount(path[front][len]); for( i = 0; i < 2; i++) { quick_sort(root, 0, root_cnt-1); switch(i) { case 0: if( b_search(root, path[front][len]+bit, root_cnt) != 1) { if( path[front][len]+bit == goal ) { if( ans[1] == NULL || ans[1] >len) { ans[0] = front; ans[1] = len; } } else if( path[front][len]+bit < goal) { root[root_cnt] = path[front][len]+bit; root_cnt++; int j; for( j = 0; j <= len; j++) { path[rear][j] = path[front][j]; } path[rear][len+1] = path[front][len]+bit; length[rear] = len + 1; rear++; } } break; case 1: if( b_search(root, path[front][len]-bit, root_cnt) != 1 && path[front][len] < goal && path[front][len]-bit > 0) { root[root_cnt] = path[front][len]-bit; root_cnt++; int j; for( j = 0; j <= len; j++) { path[rear][j] = path[front][j]; } path[rear][len+1] = path[front][len]-bit; length[rear] = len + 1; rear++; } break; } } front++; } return 0; } int bitCount(int bit) { int cnt = 0; for( ; bit != 0; bit>>=1) { cnt += bit & 1; } return cnt; } int b_search( int *array, int target, int size) { int min = 0, max = size-1, mid; while( min <= max) { mid = (min+max)/2; if( array[mid] == target) { return 1; } else if( array[mid] < target) { min = mid+1; } else if ( array[mid] > target) { max = mid-1; } } return NULL; } void quick_sort(int *array, int left, int right) { if( left >= right) return; int p = left, k = p+1; while( k <= right ) { if( array[k] < array[left] ) { change(array[k], array[p+1]); p++; } k++; } change(array[left], array[p]); quick_sort(array, left, p-1); quick_sort(array, p+1, right); } void change(int &a, int &b) { int temp = a; a = b; b = temp; }