結合数の単純なテンプレート
階乗と階乗逆元前処理を使用しました。
/*
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:白さん、よろしくお願いします。