#[inline]
pub fn n_of_m_eval(input: u64, n: u64, m: u64) -> u64 {
let window = input / m;
let pos = input % m;
let my_hash = crate::numeric::hash::splitmix64_u64(
window.wrapping_mul(0x517cc1b727220a95) ^ pos.wrapping_mul(0x9e3779b97f4a7c15),
);
let mut rank: u64 = 0;
for i in 0..m {
if i == pos {
continue;
}
let other_hash = crate::numeric::hash::splitmix64_u64(
window.wrapping_mul(0x517cc1b727220a95) ^ i.wrapping_mul(0x9e3779b97f4a7c15),
);
if other_hash < my_hash || (other_hash == my_hash && i < pos) {
rank += 1;
}
}
if rank < n { 1 } else { 0 }
}