Submission #1280787

#TimeUsernameProblemLanguageResultExecution timeMemory
1280787AlgorithmWarriorNoM (RMI21_nom)C++20
100 / 100
150 ms114936 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...