1
- [mint]
2
1
// 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];
12
10
}
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];
16
19
}
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