package main import "fmt" type intQueue []int func newIntQueue(size int) *intQueue { q := make(intQueue, 0, size) return &q } func (q *intQueue) Len() int { return len(*q) } func (q *intQueue) Empty() bool { return q.Len() == 0 } func (q *intQueue) Push(x int) { *q = append(*q, x) } func (q *intQueue) Peek() int { return (*q)[0] } func (q *intQueue) Pop() int { z := (*q)[0] *q = (*q)[1:] return z } func d(x int) (z int) { for x > 0 { z += x & 1 x >>= 1 } return } func min(x, y int) int { if y < x { return y } return x } func main() { Inf := 1 << 28 var N int fmt.Scan(&N) dp := make([]int, N+1) for i := 0; i <= N; i++ { dp[i] = Inf } dp[1] = 1 q := newIntQueue(N) q.Push(1) for !q.Empty() { x := q.Pop() dx := d(x) if x-dx > 1 && dp[x-dx] == Inf { dp[x-dx] = dp[x] + 1 q.Push(x - dx) } if x+dx <= N && dp[x+dx] == Inf { dp[x+dx] = dp[x] + 1 q.Push(x + dx) } } if dp[N] == Inf { dp[N] = -1 } fmt.Println(dp[N]) }