use core::ops::Range;
pub(crate) fn share(budget: usize, tasks: usize, k: usize) -> usize {
debug_assert!(tasks >= 1 && k < tasks);
budget / tasks + usize::from(k < budget % tasks)
}
pub(crate) fn range_plan(len: usize, grain: usize, budget: usize) -> (usize, usize) {
debug_assert!(len > 0 && grain > 0 && budget > 0);
let tasks = budget.min(len.div_ceil(grain));
let chunk = len.div_ceil(tasks).max(grain);
(chunk, len.div_ceil(chunk))
}
pub(crate) fn chunk_range(len: usize, chunk: usize, k: usize) -> Range<usize> {
let start = k * chunk;
start..(start + chunk).min(len)
}