← Home
package main

import (
	"fmt"
)

func main() {
	var n int
	var mod int64
	if _, err := fmt.Scan(&n, &mod); err != nil {
		return
	}

	if n == 1 {
		fmt.Println(0)
		return
	}

	maxInversions := n * (n - 1) / 2
	cnt := make([][]int64, n+1)
	for i := range cnt {
		cnt[i] = make([]int64, maxInversions+1)
	}
	cnt[1][0] = 1
	for k := 2; k <= n; k++ {
		for v := 0; v <= k*(k-1)/2; v++ {
			var sum int64 = 0
			for j := 0; j <= v && j < k; j++ {
				sum = (sum + cnt[k-1][v-j]) % mod
			}
			cnt[k][v] = sum
		}
	}

	mult := make([]int64, n+1)
	mult[n] = 1
	for L := n - 1; L >= 1; L-- {
		mult[L] = (mult[L+1] * int64(L+1)) % mod
	}

	var ans int64 = 0
	for L := 1; L <= n; L++ {
		K := L - 1
		if K == 0 {
			continue
		}

		max_v := K * (K - 1) / 2
		pref := make([]int64, max_v+1)
		pref[0] = cnt[K][0]
		for i := 1; i <= max_v; i++ {
			pref[i] = (pref[i-1] + cnt[K][i]) % mod
		}

		var term int64 = 0
		for d := 1; d <= K; d++ {
			var f_Kd int64 = 0
			for v1 := d + 1; v1 <= max_v; v1++ {
				ways := (cnt[K][v1] * pref[v1-d-1]) % mod
				f_Kd = (f_Kd + ways) % mod
			}
			term = (term + int64(L-d)*f_Kd) % mod
		}
		ans = (ans + mult[L]*term) % mod
	}

	fmt.Println(ans)
}