[DP记录]AT2000 [AGC002F] Leftmost Ball
command_block · · 个人记录
题意 : 给你
答案对
复杂度
#include<algorithm>
#include<cstdio>
#define ll long long
#define MaxN 2050
using namespace std;
const int mod=1000000007;
ll powM(ll a,int t=mod-2){
ll ret=1;
while(t){
if (t&1)ret=ret*a%mod;
a=a*a%mod;t>>=1;
}return ret;
}
int fac[MaxN*MaxN],ifac[MaxN*MaxN];
int C(int n,int m)
{return 1ll*fac[n]*ifac[m]%mod*ifac[n-m]%mod;}
void Init(int n)
{
fac[0]=1;
for (int i=1;i<=n;i++)
fac[i]=1ll*fac[i-1]*i%mod;
ifac[n]=powM(fac[n]);
for (int i=n;i;i--)
ifac[i-1]=1ll*ifac[i]*i%mod;
}
int n,k,dp[MaxN][MaxN];
int main()
{
scanf("%d%d",&n,&k);
Init(n*k);
if (k==1){puts("1");return 0;}
dp[0][0]=1;
for (int i=0;i<=n;i++)
for (int j=0;j<=i;j++){
if (j+1<=i)
dp[i][j+1]=(dp[i][j+1]+1ll*dp[i][j]*(n-j)%mod*C(n*k-i-j*(k-1)-1,k-2))%mod;
dp[i+1][j]=(dp[i+1][j]+dp[i][j])%mod;
}
printf("%d",dp[n][n]);
return 0;
}