Go Ladder
func ladder(a, b []int) []int {
size := len(a)
result := make([]int, size)
maxB := b[0]
for _, v := range b {
if v > maxB {
maxB = v
}
}
mod := (1 << maxB) - 1
maxA := a[0]
for _, v := range a {
if v > maxA {
maxA = v
}
}
fib := make([]int, maxA+2)
fib[0], fib[1] = 0, 1
for i := 2; i < maxA+2; i++ {
fib[i] = (fib[i-1] + fib[i-2]) & mod
}
for i := 0; i < size; i++ {
result[i] = fib[a[i]+1] & ((1 << b[i]) - 1)
}
return result
}
This precomputes climb counts once and applies the modulo per query, which avoids recalculating the same paths over and over.