dsalgo/
enumerate_repeated_products_inplace_iterative.rs1pub 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}