aboutsummaryrefslogtreecommitdiff
path: root/binom.h
blob: 8645371e7b3bd62f0b35aa0d1a0d992a442728d3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <vector>

template <typename Mod> struct Binom {
  explicit Binom(int n) : fact(n), inv_fact(n) {
    fact[0] = inv_fact[0] = inv_fact[1] = Mod{1};
    for (int i = 2; i < n; ++i) {
      inv_fact[i] = -Mod{Mod::mod() / i} * inv_fact[Mod::mod() % i];
    }
    for (int i = 1; i < n; ++i) {
      fact[i] = Mod{i} * fact[i - 1];
      inv_fact[i] *= inv_fact[i - 1];
    }
  }

  Mod operator()(int n, int k) const {
    return k < 0 || k > n ? Mod{0} : fact[n] * inv_fact[n - k] * inv_fact[k];
  }

  std::vector<Mod> fact, inv_fact;
};