组合数模板-通用版本

简单说明

直接放代码不友好,说句话缓冲一下....这里的模板复制不会直接红一片(体验会好一些),哦,对了,使用函数C(n,m)之前,需要先用init()预处理一下,不然C(n,m)的结果就是0了。

代码区

typedef long long ll;
const ll mod = 1e9 + 7;
const int Max = 1e6 + 10;
ll fact[Max], ifact[Max];		//fact[i]是i的阶乘,ifact[i]是阶乘的除法逆元,两者用于求组合数

ll pow_mod(ll n, ll k)
{
	ll res = 1;
	n = n % mod;
	while (k > 0)
	{
		if (k & 1)
			res = res * n % mod;
		n = n * n % mod;
		k >>= 1;
	}
	return res;
}

void init()		//初始化
{
	fact[0] = ifact[0] = 1;
	for (int i = 1;i < Max; i++)
	{
		fact[i] = (fact[i - 1] * i) % mod;
		ifact[i] = pow_mod(fact[i], mod - 2);
	}
}

ll C(ll n, ll m)
{
	if (n < m || m < 0) return 0;		//不合法
	return (fact[n] * ifact[m] % mod) * ifact[n - m] % mod;
}