#include <cstdio>
#include <cstring>
const int N = 505;
int n, P, fac[N], C[N][N], F[2][N*N*2], G[2][N*N*2], ans;
void add(int &x, int y) { x = x + y; if (x >= P) x -= P; }
int &f(int x, int y) { return F[x][y+N*N]; }
int &g(int x, int y) { return G[x][y+N*N]; }
int sumf(int t, int l, int r) { return (f(t, r) - f(t, l-1) + P) % P; }
int sumg(int t, int l, int r) { return (g(t, r) - g(t, l-1) + P) % P; }
signed main() {
    scanf("%d%d", &n, &P);
    fac[0] = 1;
    for (int i = 1; i <= n; i++) fac[i] = 1ll * fac[i-1] * i % P;
    C[0][0] = 1;
    for (int i = 1; i <= n; i++) {
        C[i][0] = 1;
        for (int j = 1; j <= i; j++) C[i][j] = (C[i-1][j] + C[i-1][j-1]) % P;
    }
    f(0, 0) = 1;
    for (int i = 1, t = 1; i <= n; i++, t = !t) {
        memset(F[t], 0, sizeof F[t]);
        memset(G[t], 0, sizeof G[t]);
        int m = i*i;
        for (int j = -m-i; j <= m+i; j++) add(f(!t, j), f(!t, j-1));
        for (int j = 1; j < i; j++)
            for (int k = j+1; k <= i; k++)
                add(ans, 1ll * sumf(!t, k-j+1, m) * fac[n-i] % P * C[n][n-i] % P);
        for (int j = -m; j <= m; j++) g(t, j) = sumf(!t, j-i+1, j);
        for (int j = -m-i; j <= m+i; j++) add(g(t, j), g(t, j-1));
        for (int j = -m; j <= m; j++) f(t, j) = sumg(t, j, j+i-1);
    }
    printf("%d", ans);
    return 0;
}