- 基础组合数学
Code
#include<bits/stdc++.h>
#define rep(i,a,b) for(ll i=(a);i<=(b);i++)
#define ll long long
using namespace std;
const ll N=4e3;
ll fact[N],dp[N][N],c[N][N],n,mod,ans=0;
int main()
{
scanf("%lld%lld",&n,&mod);
fact[0]=1;rep(i,1,n)fact[i]=fact[i-1]*i%mod;
c[0][0]=1;
rep(i,1,n){c[i][0]=1;rep(j,1,i)c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;}
rep(i,2,n){
rep(j,1,n-i+1){
ans=(ans+fact[j]*c[n-i][j-1]%mod*j%mod*(n-j)%mod*fact[n-j-1]%mod*i%mod*(i-1)%mod)%mod;
}
}
cout<<ans;
return 0;
}