제출 #1213606

#제출 시각아이디문제언어결과실행 시간메모리
1213606MuhammadSaramNoM (RMI21_nom)C++20
100 / 100
34 ms23112 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int M = 2000 + 1, mod = 1e9 + 7; int fac[M*2], ifac[M*2], cnt[M], dp[M][M]; int power(int a,int b) { int ans=1; for (;b;b>>=1,a=a*a%mod) if (b&1) ans=ans*a%mod; return ans; } int ncr(int n,int k) { return fac[n]*ifac[k]%mod*ifac[n-k]%mod; } int per(int x,int k) { return ncr(x,k)*fac[k]%mod; } signed main() { fac[0]=ifac[0]=1; for (int i=1;i<M*2;i++) fac[i]=fac[i-1]*i%mod,ifac[i]=power(fac[i],mod-2); int n,m; cin>>n>>m; for (int i=1;i<=2*n;i++) cnt[i%m+1]++; dp[0][0]=1; for (int i=1,su=0;i<=m;su+=cnt[i]/2,i++) for (int k=0;k*2<=cnt[i];k++) { for (int j=0;j<=su;j++) dp[i][k+j]+=per(cnt[i],2*k)*dp[i-1][j]%mod*ncr(j+k,j), dp[i][k+j]%=mod; } for (int i=0;i<=n;i++) dp[m][i]=dp[m][i]*fac[2*(n-i)]%mod; int ans=fac[2*n]; for (int i=1,mu=-1;i<=n;i++,mu*=-1) ans=(ans+ncr(n,i)*dp[m][i]*mu%mod+mod)%mod; cout<<ans<<endl; 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...