Rust Ladder
fn ladder(a: &[i64], b: &[i64]) -> Vec<i64> {
let size = a.len();
let mut r = vec![0i64; size];
let max_b = *b.iter().max().unwrap();
let mod_mask = (1i64 << max_b) - 1;
let max_a = *a.iter().max().unwrap();
let mut fib = vec![0i64, 1];
for i in 2..(max_a as usize + 2) {
fib.push((fib[i - 1] + fib[i - 2]) & mod_mask);
}
for i in 0..size {
r[i] = fib[(a[i] + 1) as usize] & ((1i64 << b[i]) - 1);
}
r
}
This precomputes climb counts once and applies the modulo per query, which avoids recalculating the same paths over and over.