fn run(sc: &mut scanner::Scanner, out: &mut std::io::BufWriter) { let t: u32 = sc.next(); let mut dp = vec![std::cell::Cell::new(0usize); 100000 / 64 + 1]; for _ in 0..t { let n: usize = sc.next(); let w: usize = sc.next(); let a: Vec = sc.next_vec(n); let ans = unsafe {solve(w, a, &mut dp)}; writeln!(out, "{}", ans).ok(); } } #[target_feature(enable = "avx2")] unsafe fn solve(len: usize, a: Vec, dp: &mut Vec>) -> usize { let w = std::mem::size_of::() * 8; dp.clear(); dp.resize(len / w + 1, std::cell::Cell::new(0usize)); dp[0].set(1); for a in a { let q = a / w; let r = a % w; if q >= dp.len() { continue; } if r == 0 { for (a, b) in dp[q..].iter().zip(dp.iter()).rev() { let v = b.get() | a.get(); a.set(v); } } else { for ((a, b), c) in dp[q + 1..].iter().zip(dp.iter()).zip(dp[1..].iter()).rev() { let v = a.get() | (b.get() >> (w - r)) | (c.get() << r); a.set(v); } if q < dp.len() { let v = dp[q].get() | (dp[0].get() << r); dp[q].set(v); } } } let r = (len + 1) % w; if r != 0 { let v = dp[dp.len() - 1].get() & ((1 << r) - 1); dp[dp.len() - 1].set(v); } let x = dp.iter().rposition(|dp| dp.get() != 0).unwrap(); w * (x + 1) - dp[x].get().leading_zeros() as usize - 1 // (0..=len).rfind(|i| dp[i / w].get() >> (i % w) & 1 == 1).unwrap() } // ---------- begin scannner ---------- #[allow(dead_code)] mod scanner { use std::str::FromStr; pub struct Scanner<'a> { it: std::str::SplitWhitespace<'a>, } impl<'a> Scanner<'a> { pub fn new(s: &'a String) -> Scanner<'a> { Scanner { it: s.split_whitespace(), } } pub fn next(&mut self) -> T { self.it.next().unwrap().parse::().ok().unwrap() } pub fn next_bytes(&mut self) -> Vec { self.it.next().unwrap().bytes().collect() } pub fn next_chars(&mut self) -> Vec { self.it.next().unwrap().chars().collect() } pub fn next_vec(&mut self, len: usize) -> Vec { (0..len).map(|_| self.next()).collect() } } } // ---------- end scannner ---------- use std::io::Write; use std::collections::*; type Map = BTreeMap; type Set = BTreeSet; type Deque = VecDeque; fn main() { use std::io::Read; let mut s = String::new(); std::io::stdin().read_to_string(&mut s).unwrap(); let mut sc = scanner::Scanner::new(&s); let out = std::io::stdout(); let mut out = std::io::BufWriter::new(out.lock()); run(&mut sc, &mut out); }