fn main() { let mut nm = String::new(); std::io::stdin().read_line(&mut nm).ok(); let nm: Vec = nm.trim().split_whitespace().map(|s| s.parse().unwrap()).collect(); let n = nm[0]; let MOD = nm[1]; let limit = n * (n-1) / 2; let mut dp = vec![vec![0usize; limit+1]; n+1]; dp[0][0] = 1; for i in 1..2*n { let mut next_dp = vec![vec![0usize; limit+1]; n+1]; for j in 0..=n { for cnt in 0..=limit { if dp[j][cnt] == 0 { continue; } next_dp[j][cnt] += dp[j][cnt]; next_dp[j][cnt] %= MOD; if j < n && (i+1)/2 >= j+1 { let zero_used = i - j; if cnt+n >= zero_used { next_dp[j+1][cnt+n-zero_used] += dp[j][cnt]; next_dp[j+1][cnt+n-zero_used] %= MOD; } } } } dp = next_dp; } for i in 0..=limit { println!("{}", dp[n][i]); } for i in limit+1..=n*n { println!("0"); } }