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)
}