#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=505;
int _suf[N*N],_ssuf[N*N];
int d[N*N],n,md,*suf=_suf+600,f[N],*ssuf=_ssuf+600,pre[N*N],binom[N][N],fac[N];
inline void upd(int&a){a+=a>>31&md;}
int main(){
	cin>>n>>md;
	d[0]=1;
	for(int i=1;i<n;++i){
		int lim=i*(i+1)/2;
		suf[lim]=ssuf[lim]=d[lim];
		pre[0]=d[0];
		for(int i=1;i<=lim;++i)upd(pre[i]=pre[i-1]+d[i]-md);
		for(int i=lim-1;i>=-n;--i)if(i>=0){
			upd(suf[i]=suf[i+1]+pre[i]-md);
			upd(ssuf[i]=ssuf[i+1]+suf[i]-md);
		}else{
			suf[i]=suf[i+1];
			upd(ssuf[i]=ssuf[i+1]+suf[i]-md);
		}
		for(int j=1;j<=lim;++j){
			int l=j-i-1;
			int x=(ssuf[l]-ssuf[j-1]-(LL)suf[j-1]*i%md+2*md)%md;
			f[i+1]=(f[i+1]+(LL)x*d[j])%md;
		}
		static int tmp[N*N];
		for(int j=0;j<=lim;++j)if(d[j])
		upd(tmp[j]+=d[j]-md),upd(tmp[j+i+1]-=d[j]);
		d[0]=tmp[0];
		tmp[0]=0;
		for(int j=1;j<=lim+i;++j)
		upd(d[j]=tmp[j]+d[j-1]-md),tmp[j]=0;
	}
	binom[0][0]=1;
	for(int i=1;i<=n;++i){
		binom[i][0]=1;
		for(int j=1;j<=i;++j)
		upd(binom[i][j]=binom[i-1][j]+binom[i-1][j-1]-md);
	}
	for(int i=*fac=1;i<=n;++i)
	fac[i]=(LL)fac[i-1]*i%md;
	int ans=0;
	for(int i=0;i<n;++i){
		ans=(ans+(LL)binom[n][i]*fac[i]%md*f[n-i])%md;
	}
	cout<<ans<<'\n';
	return 0;
}