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
*/
14
struct
CombinationLucas
{
15
/// @brief Lucas の定理を用いて二項係数を計算するための前計算をする
16
/// @note O(mod)
17
CombinationLucas
(
int
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
33
private
:
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
};
CombinationLucas
Lucas の定理を用いた二項係数計算用ライブラリ
Definition
combination_lucas.hpp:14
CombinationLucas::CombinationLucas
CombinationLucas(int mod)
Lucas の定理を用いて二項係数を計算するための前計算をする
Definition
combination_lucas.hpp:17
CombinationLucas::comb
ll comb(int n, int r)
nCr mod を返す
Definition
combination_lucas.hpp:28
mod
combination_lucas.hpp
構築:
1.13.2