Problem:
Problem Statement

Snuke loves colorful balls. He has a total of N×K balls, K in each of his favorite N colors. The colors are numbered 1 through N.

He will arrange all of the balls in a row from left to right, in arbitrary order. Then, for each of the N colors, he will paint the leftmost ball of that color into color 0, a color different from any of the N original colors.

After painting, how many sequences of the colors of the balls are possible? Find this number modulo 10^9+7.

Constraints

1≤N,K≤2,000

Input

The input is given from Standard Input in the following format:

N K

Output

Print the number of the possible sequences of the colors of the balls after painting, modulo 10^9+7.

Sample Input 1

2 2

Sample Output 1

4

The following 4 sequences are possible:

(0,1,0,2)

(0,0,1,2)

(0,2,0,1)

(0,0,2,1)

Sample Input 2

3 1

Sample Output 2

1

The following 1 sequence is possible:

(0,0,0)

Sample Input 3

2 3

Sample Output 3

14

Sample Input 4

2000 2000

Sample Output 4

546381702

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
inline int read()
{
	int t=1,sum=0;char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-') t=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
		sum=sum*10+ch-'0',ch=getchar();
	return t*sum;
}
const int _N=2e3+10,_M=4e6+10,mod=1e9+7;
int fac[_M],inv[_M],f[_N][_N],n,m;
void up(int &x,int y)
{
	x+=y;
	if(x>=mod) x-=mod;
}
int C(int x,int y)
{
	if(x<y) return 0;
	return 1LL*fac[x]*inv[y]%mod*inv[x-y]%mod;
}
int main()
{
	int i,j;
	n=read(); m=read();
	if(m==1) return puts("1"),0;
	fac[0]=inv[0]=inv[1]=1;
	for(i=2;i<=n*m;i++)
		inv[i]=1LL*(mod-mod/i)*inv[mod%i]%mod;
	for(i=1;i<=n*m;i++)
		fac[i]=1LL*fac[i-1]*i%mod,
		inv[i]=1LL*inv[i-1]*inv[i]%mod;
	f[0][0]=1;
	for(i=0;i<=n;i++)
		for(j=0;j<=n;j++)
			if(f[i][j])
			{
				if(j!=n)
					up(f[i][j+1],1LL*f[i][j]*C(i-1+(m-1)*(j+1),m-2)%mod);
				if(i<j)
					up(f[i+1][j],f[i][j]);
			}
	printf("%d\n",1LL*fac[n]*f[n][n]%mod);
	return 0;
}