Kyopro Library
 
読み取り中…
検索中…
一致する文字列を見つけられません
combination_lucas.hpp
[詳解]
1#include"../../kyopro_library/template.hpp"
2#include"../../kyopro_library/others/modcal.hpp"
3
4/**
5 * @brief Lucas の定理を用いた二項係数計算用ライブラリ
6 * @details
7 * Lucas の定理
8 * p を素数とし、n, r を非負整数とする。
9 * また、n = n[k]p^k + n[k-1]p^(k-1) + ... + n[1]p + n[0],
10 * r = r[k]p^k + r[k-1]p^(k-1) + ... + r[1]p + r[0] とする。
11 *
12 * このとき、nCr(mod p) = Π[k=0~N]n[k]Cr[k]
13 */
15 /// @brief Lucas の定理を用いて二項係数を計算するための前計算をする
16 /// @note O(mod)
18 this->mod=mod;
19 fact=vector<ll>(mod); fact[0]=1;
20 factinv=vector<ll>(mod);
21 for(int i=1; i<mod; i++) fact[i]=fact[i-1]*i%mod;
22 factinv[mod-1]=ModInv(fact[mod-1],mod);
23 for(int i=mod-2; i>=0; i--) factinv[i]=factinv[i+1]*(i+1)%mod;
24 }
25
26 /// @brief nCr mod を返す
27 /// @note O(log(n))
28 ll comb(int n, int r) {
29 if(r==0||r==n) return 1;
30 return calc(n%mod,r%mod)*comb(n/mod,r/mod)%mod;
31 }
32
33private:
34 vector<ll> fact,factinv;
35 int mod;
36 ll calc(int n, int r) {
37 if(n<r||r<0||n<0) return 0;
38 return fact[n]*factinv[r]%mod*factinv[n-r]%mod;
39 }
40};
Lucas の定理を用いた二項係数計算用ライブラリ
CombinationLucas(int mod)
Lucas の定理を用いて二項係数を計算するための前計算をする
ll comb(int n, int r)
nCr mod を返す