haar_lib/math/
montmort.rs1pub fn montmort(n: usize, m: u64) -> Vec<u64> {
11 let mut ret = vec![0; n + 1];
12
13 if n >= 2 {
14 ret[2] = 1;
15
16 for i in 3..=n {
17 ret[i] = (i - 1) as u64 * (ret[i - 1] + ret[i - 2]) % m;
18 }
19 }
20
21 ret
22}
23
24#[cfg(test)]
25mod tests {
26 use super::*;
27
28 #[test]
29 fn test() {
30 assert_eq!(montmort(10, 100)[1..], [0, 1, 2, 9, 44, 65, 54, 33, 96, 61]);
31 assert_eq!(
32 montmort(20, 998244353)[1..],
33 [
34 0, 1, 2, 9, 44, 265, 1854, 14833, 133496, 1334961, 14684570, 176214841, 294304226,
35 127281753, 910981941, 600290115, 222488424, 11814221, 224470198, 496426549
36 ]
37 );
38 }
39}