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...