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