This documentation is automatically generated by online-judge-tools/verification-helper
#include "Number/combination.hpp"#pragma once
#include <vector>
template <class T>
struct Combination {
int max_n;
std::vector<T> f, invf;
explicit Combination(int n)
: max_n(n), f(n + 1), invf(n + 1) {
f[0] = 1;
for (int i = 1; i <= n; ++i) {
f[i] = f[i - 1] * i;
}
invf[max_n] = f[max_n].inv();
for (int i = max_n - 1; i >= 0; --i) {
invf[i] = invf[i + 1] * (i + 1);
}
}
T fact(int n) const { return n < 0 ? T(0) : f[n]; }
T invfact(int n) const { return n < 0 ? T(0) : invf[n]; }
T perm(int a, int b) const {
return a < b || b < 0 ? T(0) : f[a] * invf[a - b];
}
T binom(int a, int b) const {
return a < b || b < 0 ? T(0) : f[a] * invf[a - b] * invf[b];
}
};#line 2 "Number/combination.hpp"
#include <vector>
template <class T>
struct Combination {
int max_n;
std::vector<T> f, invf;
explicit Combination(int n)
: max_n(n), f(n + 1), invf(n + 1) {
f[0] = 1;
for (int i = 1; i <= n; ++i) {
f[i] = f[i - 1] * i;
}
invf[max_n] = f[max_n].inv();
for (int i = max_n - 1; i >= 0; --i) {
invf[i] = invf[i + 1] * (i + 1);
}
}
T fact(int n) const { return n < 0 ? T(0) : f[n]; }
T invfact(int n) const { return n < 0 ? T(0) : invf[n]; }
T perm(int a, int b) const {
return a < b || b < 0 ? T(0) : f[a] * invf[a - b];
}
T binom(int a, int b) const {
return a < b || b < 0 ? T(0) : f[a] * invf[a - b] * invf[b];
}
};