dsalgo 0.3.10

A package for Datastructures and Algorithms.
Documentation
pub struct KthFrom {
    cycles: Vec<Vec<usize>>,
    cycle_id: Vec<usize>,
    idx_in_cycle: Vec<usize>,
}

impl KthFrom {
    pub fn new(f: &[usize]) -> Self {
        let mut cycles = vec![];

        let n = f.len();

        let mut cycle_id = vec![n; n];

        let mut idx_in_cycle = vec![n; n];

        for mut i in 0..n {
            if cycle_id[i] != n {
                continue;
            }

            let id = cycles.len();

            let mut cycle = vec![];

            for j in 0..n {
                if cycle_id[i] != n {
                    break;
                }

                cycle_id[i] = id;

                idx_in_cycle[i] = j;

                cycle.push(i);

                i = f[i];
            }

            cycles.push(cycle);
        }

        Self { cycles, cycle_id, idx_in_cycle }
    }

    pub fn get(
        &self,
        i: usize,
        k: usize,
    ) -> usize {
        let cycle = &self.cycles[self.cycle_id[i]];

        cycle[(k + self.idx_in_cycle[i]) % cycle.len()]
    }
}

#[cfg(test)]

mod tests {

    #[test]

    fn test() {}
}