#include<bits/stdc++.h>
#define LL long long
#define dl double
#define SZ(a) ((int)a.size())
using namespace std;

const int N = 505;
const int P = 127000;

int f[2][N * N],s[2][N * N];
int n,mod;
void add(int &x,int y){x += y;if(x >= mod)x -= mod;}

int main(){
  // freopen("in.txt","r",stdin);
  // freopen("o.txt","w",stdout);
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
  cin >> n >> mod;
  int ANS = 0,mx = n * (n + 1) / 2;
  f[0][P] = 1;
  for(int j = -mx;j <= mx;j++)
    s[0][j + P] = (s[0][j - 1 + P] + f[0][j + P]) % mod;
  for(int i = 1;i <= n;i++){
    int u = i & 1,v = (i - 1) & 1;
    for(int j = -mx;j <= mx;j++)f[u][j + P] = 0;
    int o = i * (i - 1) / 2;
    for(int j = -o;j <= o;j++){
      if(j == -o)
        for(int k = j - i + 1;k <= j + i - 1;k++)
          add(f[u][j + P],1ll * f[v][k + P] * (i - abs(j - k))% mod);
      else {
        int now = (s[v][j + i - 1 + P] - s[v][j - 1 + P] + mod) % mod -
        (s[v][j - 1 + P] - s[v][j - i - 1 + P] + mod) % mod;
        now = (now + mod) % mod;
        f[u][j + P] = (f[u][j - 1 + P] + now) % mod;
      }
    }
    for(int j = -mx;j <= mx;j++)//最多访问到n + (n - 1) * n / 2
      s[u][j + P] = (s[u][j - 1 + P] + f[u][j + P]) % mod;

    int ans = 0;
    for(int j = 1;j < i;j++){
      int cnt = i - j,now = 0;
      add(now,(s[v][mx + P] - s[v][j + P] + mod) % mod);
      add(ans,1ll * now * cnt % mod);
    }
    ANS = 1ll * ANS * i % mod;
    add(ANS,ans);
  }
  cout << ANS << endl;  
  return 0;
}
/**/