const int MAXN = 1e7;
const int MOD = 1e9 + 7;
 
vector<int> fact(MAXN), invfact(MAXN);
bool inited = 0;
int ksm(int base, int exp)
{
	int ans = 1;
	while (exp)
	{
		if (exp & 1)
		{
			ans = ans * base % MOD;
		}
		base = base * base % MOD;
		exp >>= 1;
	}
	return ans;
}
 
int inv(int x)
{
	return ksm(x, MOD - 2);
}
 
void pre()
{
	if (inited) return;
	inited = 1;
	fact[0] = 1;
	for (int i = 1; i < MAXN; i++)
	{
		fact[i] = fact[i - 1] * i % MOD;
	}
 
	invfact[MAXN - 1] = inv(fact[MAXN - 1]);
	for (int i = MAXN - 2; i >= 0; i--)
	{
		invfact[i] = invfact[i + 1] * (i + 1) % MOD;
	}
}
 
int comb(int n, int k)
{
	if (!inited) pre();
	if (k < 0 or k > n) return 0;
	return fact[n] * invfact[k] % MOD * invfact[n - k] % MOD;
}