dsalgo/
enumerate_repeated_products_inplace_iterative.rs

1pub fn repeated_products(
2    n: usize,
3    k: usize,
4) -> Vec<Vec<usize>> {
5    if n == 0 {
6        assert!(k == 0);
7    }
8
9    let mut res = vec![];
10
11    let mut a: Vec<_> = vec![0; k];
12
13    loop {
14        res.push(a.clone());
15
16        let mut i = k;
17
18        for j in (0..k).rev() {
19            if a[j] != n - 1 {
20                i = j;
21
22                break;
23            }
24        }
25
26        if i == k {
27            return res;
28        }
29
30        a[i] += 1;
31
32        for j in i + 1..k {
33            a[j] = 0;
34        }
35    }
36}
37
38#[cfg(test)]
39
40mod tests {
41
42    use super::*;
43
44    #[test]
45
46    fn test() {
47        let res = repeated_products(3, 3);
48
49        assert_eq!(
50            res,
51            [
52                [0, 0, 0],
53                [0, 0, 1],
54                [0, 0, 2],
55                [0, 1, 0],
56                [0, 1, 1],
57                [0, 1, 2],
58                [0, 2, 0],
59                [0, 2, 1],
60                [0, 2, 2],
61                [1, 0, 0],
62                [1, 0, 1],
63                [1, 0, 2],
64                [1, 1, 0],
65                [1, 1, 1],
66                [1, 1, 2],
67                [1, 2, 0],
68                [1, 2, 1],
69                [1, 2, 2],
70                [2, 0, 0],
71                [2, 0, 1],
72                [2, 0, 2],
73                [2, 1, 0],
74                [2, 1, 1],
75                [2, 1, 2],
76                [2, 2, 0],
77                [2, 2, 1],
78                [2, 2, 2]
79            ]
80        );
81    }
82}