結合数の単純なテンプレート


階乗と階乗逆元前処理を使用しました。
/*
    C(n, m)   
lzh007  2020/6/1

****    N       mod     ***

*/

#include
#include
#include
#include
#include
using namespace std;
typedef long long LL;
const int NN = 1e5 + 17;//    
const LL mod = 1e9 + 7;//   
LL f[NN], inv[NN], finv[NN];
//f    ,inv       ,finv     ,         

//     
LL km(LL base, LL b) {
	LL ans = 1;
	while (b > 0) {
		if (b & 1)
			ans = (ans * base) % mod;
		base = (base * base) % mod;
		b /= 2;
	}
	return ans;
}

//   f[NN], inv[NN], finv[NN]
void init() {
	f[0] = inv[0] = finv[0] = 1;
	f[1] = inv[1] = finv[1] = 1;
	for (LL i = 2; i < NN; i++) {
		f[i] = f[i - 1] * i % mod;
		inv[i] = (mod - mod / i) * inv[mod % i] % mod;
		finv[i] = (finv[i - 1] * inv[i]) % mod;
	}
}

//       C(n, m)
LL cnm(LL n, LL m) {
	return ((f[n] * finv[m] % mod) * finv[n - m]) % mod;
}

int main() {
	init();
	LL n, m;
	while (cin >> n >> m) {
		cout << "C(" << n << ', ' << m << ")   " << mod << "        " << cnm(n, m) << endl;
	}
	return 0;
}
ps:白さん、よろしくお願いします。