55#include < vector>
66
77template <int md> struct ModInt {
8+ static_assert (md > 1 );
89 using lint = long long ;
910 constexpr static int mod () { return md; }
1011 static int get_primitive_root () {
@@ -102,39 +103,64 @@ template <int md> struct ModInt {
102103 return this ->pow (md - 2 );
103104 }
104105 }
105- constexpr ModInt fac () const {
106- while (this ->val_ >= int (facs.size ())) _precalculation (facs.size () * 2 );
107- return facs[this ->val_ ];
106+
107+ constexpr static ModInt fac (int n) {
108+ assert (n >= 0 );
109+ if (n >= md) return ModInt (0 );
110+ while (n >= int (facs.size ())) _precalculation (facs.size () * 2 );
111+ return facs[n];
108112 }
109- constexpr ModInt facinv () const {
110- while (this ->val_ >= int (facs.size ())) _precalculation (facs.size () * 2 );
111- return facinvs[this ->val_ ];
113+ [[deprecated(" use static method" )]] constexpr ModInt fac () { return ModInt::fac (this ->val_ ); }
114+
115+ constexpr static ModInt facinv (int n) {
116+ assert (n >= 0 );
117+ if (n >= md) return ModInt (0 );
118+ while (n >= int (facs.size ())) _precalculation (facs.size () * 2 );
119+ return facinvs[n];
112120 }
113- constexpr ModInt doublefac () const {
114- lint k = (this ->val_ + 1 ) / 2 ;
115- return (this ->val_ & 1 ) ? ModInt (k * 2 ).fac () / (ModInt (2 ).pow (k) * ModInt (k).fac ())
116- : ModInt (k).fac () * ModInt (2 ).pow (k);
121+ [[deprecated(" use static method" )]] constexpr ModInt facinv () {
122+ return ModInt::facinv (this ->val_ );
117123 }
118124
119- constexpr ModInt nCr (int r) const {
120- if (r < 0 or this ->val_ < r) return ModInt (0 );
121- return this ->fac () * (*this - r).facinv () * ModInt (r).facinv ();
125+ constexpr static ModInt doublefac (int n) {
126+ assert (n >= 0 );
127+ if (n >= md) return ModInt (0 );
128+ long long k = (n + 1 ) / 2 ;
129+ return (n & 1 ) ? ModInt::fac (k * 2 ) / (ModInt (2 ).pow (k) * ModInt::fac (k))
130+ : ModInt::fac (k) * ModInt (2 ).pow (k);
131+ }
132+ [[deprecated(" use static method" )]] constexpr ModInt doublefac () {
133+ return ModInt::doublefac (this ->val_ );
122134 }
123135
124- constexpr ModInt nPr (int r) const {
136+ constexpr static ModInt nCr (int n, int r) {
137+ assert (n >= 0 );
138+ if (r < 0 or n < r) return ModInt (0 );
139+ return ModInt::fac (n) * ModInt::facinv (r) * ModInt::facinv (n - r);
140+ }
141+ [[deprecated(" use static method" )]] constexpr ModInt nCr (int r) {
142+ return ModInt::nCr (this ->val_ , r);
143+ }
144+
145+ constexpr static ModInt nPr (int n, int r) {
146+ assert (n >= 0 );
147+ if (r < 0 or n < r) return ModInt (0 );
148+ return ModInt::fac (n) * ModInt::facinv (n - r);
149+ }
150+ [[deprecated(" use static method" )]] constexpr ModInt nPr (int r) {
125151 if (r < 0 or this ->val_ < r) return ModInt (0 );
126- return this ->fac () * (* this - r). facinv ( );
152+ return ModInt::nPr ( this ->val_ , r );
127153 }
128154
129155 static ModInt binom (int n, int r) {
130156 static long long bruteforce_times = 0 ;
131157
132158 if (r < 0 or n < r) return ModInt (0 );
133- if (n <= bruteforce_times or n < (int )facs.size ()) return ModInt (n). nCr (r);
159+ if (n <= bruteforce_times or n < (int )facs.size ()) return ModInt:: nCr (n, r);
134160
135161 r = std::min (r, n - r);
136162
137- ModInt ret = ModInt (r). facinv ();
163+ ModInt ret = ModInt:: facinv (r );
138164 for (int i = 0 ; i < r; ++i) ret *= n - i;
139165 bruteforce_times += r;
140166
@@ -148,18 +174,23 @@ template <int md> struct ModInt {
148174 int sum = 0 ;
149175 for (int k : ks) {
150176 assert (k >= 0 );
151- ret *= ModInt (k). facinv (), sum += k;
177+ ret *= ModInt:: facinv (k ), sum += k;
152178 }
153- return ret * ModInt (sum).fac ();
179+ return ret * ModInt::fac (sum);
180+ }
181+ template <class ... Args> static ModInt multinomial (Args... args) {
182+ int sum = (0 + ... + args);
183+ ModInt result = (1 * ... * ModInt::facinv (args));
184+ return ModInt::fac (sum) * result;
154185 }
155186
156- // Catalan number, C_n = binom(2n, n) / (n + 1)
187+ // Catalan number, C_n = binom(2n, n) / (n + 1) = # of Dyck words of length 2n
157188 // C_0 = 1, C_1 = 1, C_2 = 2, C_3 = 5, C_4 = 14, ...
158189 // https://oeis.org/A000108
159190 // Complexity: O(n)
160191 static ModInt catalan (int n) {
161192 if (n < 0 ) return ModInt (0 );
162- return ModInt (n * 2 ). fac () * ModInt (n + 1 ). facinv () * ModInt (n). facinv ();
193+ return ModInt::fac (n * 2 ) * ModInt::facinv (n + 1 ) * ModInt:: facinv (n );
163194 }
164195
165196 ModInt sqrt () const {
0 commit comments