Skip to content

Commit 7292cf2

Browse files
committed
update comb.cpp
1 parent 246b47c commit 7292cf2

File tree

1 file changed

+31
-14
lines changed

1 file changed

+31
-14
lines changed

comb.cpp

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,34 @@
1-
[mint]
21
// combination mod prime
3-
// https://www.youtube.com/watch?v=8uowVvQ_-Mo&feature=youtu.be&t=1619
4-
struct combination {
5-
vector<mint> fact, ifact;
6-
combination(int n):fact(n+1),ifact(n+1) {
7-
assert(n < mod);
8-
fact[0] = 1;
9-
for (int i = 1; i <= n; ++i) fact[i] = fact[i-1]*i;
10-
ifact[n] = fact[n].inv();
11-
for (int i = n; i >= 1; --i) ifact[i-1] = ifact[i]*i;
2+
// https://youtu.be/8uowVvQ_-Mo?t=6002
3+
// https://youtu.be/Tgd_zLfRZOQ?t=9928
4+
struct modinv {
5+
int n; vector<mint> d;
6+
modinv(): n(2), d({0,1}) {}
7+
mint operator()(int i) {
8+
while (n <= i) d.push_back(-d[mint::mod%n]*(mint::mod/n)), ++n;
9+
return d[i];
1210
}
13-
mint operator()(int n, int k) {
14-
if (k < 0 || k > n) return 0;
15-
return fact[n]*ifact[k]*ifact[n-k];
11+
mint operator[](int i) const { return d[i];}
12+
} invs;
13+
struct modfact {
14+
int n; vector<mint> d;
15+
modfact(): n(2), d({1,1}) {}
16+
mint operator()(int i) {
17+
while (n <= i) d.push_back(d.back()*n), ++n;
18+
return d[i];
1619
}
17-
};
20+
mint operator[](int i) const { return d[i];}
21+
} facts;
22+
struct modfactinv {
23+
int n; vector<mint> d;
24+
modfactinv(): n(2), d({1,1}) {}
25+
mint operator()(int i) {
26+
while (n <= i) d.push_back(d.back()*invs(n)), ++n;
27+
return d[i];
28+
}
29+
mint operator[](int i) const { return d[i];}
30+
} ifacts;
31+
mint comb(int n, int k) {
32+
if (n < k || k < 0) return 0;
33+
return facts(n)*ifacts(k)*ifacts(n-k);
34+
}

0 commit comments

Comments
 (0)