二項係数(mod)
概要
二項係数${}_a \mathrm{C}_b (0\leq a,b\leq N )$を素数$P$で割った余りを求める.
計算量
前計算$O(N\log P)$,クエリ$O(1)$
ソースコード
template<class T> struct Combination{
int N;
vector<T> fac;//階乗
vector<T> finv;//階乗の逆元
Combination(int N){
this->N = N;
init();
}
void init(){
fac.resize(N);
finv.resize(N);
fac[0] = fac[1] = 1;
finv[0] = finv[1] = 1;
for(int i=2;i<N;i++){
fac[i] = fac[i-1] * i;
finv[i] = finv[i-1] / i;
}
}
/*aCbの計算*/
T com(int a,int b){
if(a < b)return 0;
return fac[a] * finv[b] * finv[a-b];
}
};