-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcomb.py
More file actions
37 lines (32 loc) · 1.38 KB
/
Copy pathcomb.py
File metadata and controls
37 lines (32 loc) · 1.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# Shunta の自作ライブラリ
# https://github.com/NAVYSHUNTA/atcoder-shunta-library/blob/main/math/comb/python/comb.py
# 組合せクラス
class Comb:
__fac: list[int]
__fac_inv: list[int]
__inv: list[int]
__mod: int | None
# O(n): コンストラクタ
def __init__(self, n: int, mod: int | None = None) -> None:
self.__mod = mod
self.__fac = [1] * (n + 1)
self.__fac_inv = [1] * (n + 1)
self.__inv = [1] * (n + 1)
if mod is None:
for i in range(2, n + 1):
self.__fac[i] = self.__fac[i - 1] * i
else:
for i in range(2, n + 1):
self.__fac[i] = (self.__fac[i - 1] * i) % mod
self.__inv[i] = (-self.__inv[mod % i] * (mod // i)) % mod
self.__fac_inv[i] = (self.__fac_inv[i - 1] * self.__inv[i]) % mod
# nCr の値を求めるメソッド
# O(1): コンストラクタで mod を指定していないかつ n が小さい場合
# O(1): コンストラクタで mod を指定している場合(n の値によらない)
def get_comb(self, n: int, r: int) -> int:
if n < r or min(n, r) < 0:
return 0
if self.__mod is None:
return self.__fac[n] // (self.__fac[r] * self.__fac[n - r])
else:
return (self.__fac[n] * self.__fac_inv[r] * self.__fac_inv[n - r]) % self.__mod