#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define ld long double
#define pii pair <int, int>
#define pll pair <ll, ll>
#define pci pair <char, int>
#define pld pair <ld, ld>
#define ppld pair <pld, pld>
#define ppll pair <pll, pll>
#define pldl pair <ld, ll>
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define fi first
#define se second
#define fastmap gp_hash_table
#define cd complex <double>
#define vcd vector <cd>
#define PI 3.14159265358979
using namespace std;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
ll sel[505];
ll pr[2][505 * 505], prefix[505 * 505];   
ll n, mod;
int main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin >> n >> mod;
	sel[0] = 1;
	for (ll i = 1; i <= n; i++) sel[i] = (sel[i - 1] * (n - i + 1)) % mod;
	pr[0][n * (n - 1) / 2] = 1;
	for (ll i = n * (n - 1) / 2; i <= n * n; i++) prefix[i] = 1;
	ll ans = 0;
	for (ll i = 1; i < n; i++){
		for (ll k = 0; k < i; k++) (pr[i & 1][0] += pr[(i - 1) & 1][k] * (i - k)) %= mod;
		for (ll d = 1; d <= n * (n - 1); d++){
			pr[i & 1][d] = pr[i & 1][d - 1];
			pr[i & 1][d] += prefix[d + i - 1];
			if (pr[i & 1][d] >= mod) pr[i & 1][d] -= mod;
			pr[i & 1][d] -= prefix[d - 1];
			if (pr[i & 1][d] < 0) pr[i & 1][d] += mod;
			pr[i & 1][d] -= prefix[d - 1];
			if (pr[i & 1][d] < 0) pr[i & 1][d] += mod;
			if (d >= i + 1) pr[i & 1][d] += prefix[d - i - 1];
			if (pr[i & 1][d] >= mod) pr[i & 1][d] -= mod;
		}
		prefix[0] = pr[i & 1][0];
		for (ll d = 1; d <= n * n; d++){
			prefix[d] = prefix[d - 1] + pr[i & 1][d];
			if (prefix[d] >= mod) prefix[d] -= mod;
		}
		ll prv = sel[n - i - 1];
		for (ll up = 1; up <= i + 1; up++){
			for (ll down = up + 1; down <= i + 1; down++){
				ll cp = prefix[n * n] - prefix[down - up + n * (n - 1) / 2];
				if (cp < 0) cp += mod;
				(ans += (1LL * prv * cp)) %= mod;
			}
		}
	}
	cout << ans << "\n";
} 