#include<iostream>
#include<vector>
#include<algorithm>
#include<set>
#include<unordered_set>
#include<map>
#include<unordered_map>
#include<queue>
#include<cmath>
#include<deque>
#include<stack>
#include<iomanip>
#include<random>
#include<cstdio>
#include<string>
#include<cstring>
#include<fstream>
#include<numeric>
#include<bitset>
#include<cassert>

using namespace std;

const long long N = 5e2 + 13, B = 130000 + 13;

long long dp[2][2 * B + 13], pref[2][2 * B + 13];
long long ans[N];
long long n, M;

long long mul(long long a, long long b) {
    return a * b % M;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    //cout << fixed << setprecision(30);
    int _ = 1;
    //cin >> _;
    while (_--) {
        cin >> n >> M;
        memset(dp[0], 0ll, sizeof(dp[0]));
        memset(pref[0], 0ll, sizeof(pref[0]));
        dp[0][B] = 1;
        for (int i = B; i <= 2 * B; i++) {
            pref[0][i] = 1;
        }
        for (int i = 1; i <= n; i++) {
            long long s = 1, I = i & 1, J = (I ^ 1);
            memset(dp[I], 0ll, sizeof(dp[I]));
            memset(pref[I], 0ll, sizeof(pref[I]));
            for (int j = B - i * (i - 1) / 2; j <= B + i * (i - 1) / 2; j++) {
                //cout << "dp[" << i << "][" << j - B << "] = " << s << endl;
                dp[I][j] = s;
                s = (s - 2 * pref[J][j] + pref[J][j + i] + pref[J][j - i] + 10 * M) % M;
            }
            for (int j = B - i * (i - 1) / 2; j <= B + (i + 1) * (i + 2) / 2; j++) {
                pref[I][j] = (pref[I][j - 1] + dp[I][j]) % M;
            }
            for (int j = 1; j < i; j++) {
                ans[i] = (ans[i] + mul((pref[J][i * (i - 1) / 2 + B] - pref[J][j + B] + M) % M, i - j)) % M;
            }
        }
        for (int i = 2; i <= n; i++) {
            ans[i] = (ans[i] + i * ans[i - 1]) % M;
        }
        cout << ans[n] << endl;
    }
}