#include <bits/stdc++.h>
using namespace std;
int const MAX=4005;
int const MOD=1e9+7;
int fact[MAX];
int comb[MAX][MAX];
int aranj[MAX][MAX];
int dp[MAX][MAX];
int n,m;
void precalc(){
fact[0]=1;
int i;
for(i=1;i<MAX;++i)
fact[i]=1LL*i*fact[i-1]%MOD;
int j;
for(i=0;i<MAX;++i){
comb[i][0]=1;
for(j=1;j<=i;++j)
comb[i][j]=(comb[i-1][j]+comb[i-1][j-1])%MOD;
}
for(i=0;i<MAX;++i){
aranj[i][0]=1;
for(j=1;j<=i;++j)
aranj[i][j]=1LL*aranj[i][j-1]*(i-j+1)%MOD;
}
}
void get_dp(){
int i,j,k;
dp[0][0]=1;
for(i=1;i<=m;++i){
int sz=(2*n)/m;
if(i<=(2*n)%m)
++sz;
for(j=0;j<=n;++j)
for(k=0;2*k<=sz && k<=j;++k)
dp[i][j]=(dp[i][j]+1LL*dp[i-1][j-k]*comb[n-j+k][k]%MOD*aranj[sz][2*k]%MOD)%MOD;
}
}
int solve(){
int ans=fact[2*n];
int i;
for(i=1;i<=n;++i)
if(i%2==1)
ans=(ans-1LL*dp[m][i]*fact[2*(n-i)]%MOD+MOD)%MOD;
else
ans=(ans+1LL*dp[m][i]*fact[2*(n-i)]%MOD)%MOD;
return ans;
}
int main()
{
cin>>n>>m;
precalc();
get_dp();
cout<<solve();
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |