competitive/tools/
digit_sequence.rs1pub trait ToDigitSequence: Sized {
2 fn to_digit_sequence(&self) -> Vec<Self>;
3 fn to_digit_sequence_radix(&self, radix: Self) -> Vec<Self>;
4 fn to_digit_sequence_len(&self, len: usize) -> Vec<Self>;
5 fn to_digit_sequence_radix_len(&self, radix: Self, len: usize) -> Vec<Self>;
6}
7
8macro_rules! impl_to_digit_sequence {
9 ($($t:ty)*) => {
10 $(impl ToDigitSequence for $t {
11 fn to_digit_sequence(&self) -> Vec<$t> {
12 self.to_digit_sequence_radix(10)
13 }
14 fn to_digit_sequence_radix(&self, radix: Self) -> Vec<$t> {
15 let mut x = *self;
16 let mut res: Vec<$t> = vec![];
17 while x > 0 {
18 res.push(x % radix);
19 x /= radix;
20 }
21 res.reverse();
22 res
23 }
24 fn to_digit_sequence_len(&self, len: usize) -> Vec<$t> {
25 self.to_digit_sequence_radix_len(10, len)
26 }
27 fn to_digit_sequence_radix_len(&self, radix: Self, len: usize) -> Vec<$t> {
28 let mut x = *self;
29 let mut res: Vec<$t> = vec![0; len];
30 for r in res.iter_mut().rev() {
31 if x == 0 {
32 break;
33 }
34 *r = x % radix;
35 x /= radix;
36 }
37 res
38 }
39 })*
40 };
41}
42impl_to_digit_sequence!(u8 u16 u32 u64 u128 usize);