>>738 に手を加えて10倍速くしてみた
fn solve(n: usize, limit: usize) -> Vec<usize> {
 let mut answer = Vec::new();
 let mut pnt = generate_primes(n).windows(2).rev().map(|s| (s[1], s[0], 0, 0)).collect::<Vec<_>>();
 let (mut ci, mut cn, mut ct) = (0, n, 1_usize);
 'advance: loop {
  pnt[ci..].iter_mut().for_each(|(_p, _q, n, t)| (*n, *t) = (cn, ct));
  if cn & 1 == 0 && ct.leading_zeros() >= (cn >> 1) as u32 {
   ct <<= cn >> 1; if ct <= limit { answer.push(ct); }
  }
  'back: for (i, (p, q, n, t)) in pnt.iter_mut().enumerate().rev() {
   'again: loop {
    if *n < *p { continue 'back; }
    *n -= *p; *t *= *p;
    if *n ==1 || *t > limit { continue 'back; }
    if *n == 0 { answer.push(*t); continue 'back; }
    if *q > 3 {
     let mut tt = *t * (*n % *q);
     for _ in 0..(*n / *q) { tt *= *q; if tt > limit { continue 'again; } }
    }; break 'again;
   }; (ci, cn, ct) = (i, *n, *t); continue 'advance;
  }; break 'advance;
 }; answer.sort(); answer
}