1template <
typename mint>
4 uint32_t _mod = mint::get_mod();
9 for (u64 i = 2; i * i <= m; ++i) {
12 while (m % i == 0) m /= i;
15 if (m != 1) ds[idx++] = m;
20 for (
int i = 0; i < idx; ++i) {
21 u64 a = _pr, b = (_mod - 1) / ds[i], r = 1;
23 if (b & 1) r = r * a % _mod;
40 static constexpr int level = __builtin_ctzll(mod - 1);
45 w[k - 1] = mint(pr).pow((mod - 1) / (1 << k));
46 y[k - 1] = w[k - 1].inverse();
47 for (
int i = k - 2; i > 0; --i)
48 w[i] = w[i + 1] * w[i + 1], y[i] = y[i + 1] * y[i + 1];
49 dw[1] = w[1], dy[1] = y[1], dw[2] = w[2], dy[2] = y[2];
50 for (
int i = 3; i < k; ++i) {
51 dw[i] = dw[i - 1] * y[i - 2] * w[i];
52 dy[i] = dy[i - 1] * w[i - 2] * y[i];
58 void fft4(vector<mint> &a,
int k) {
59 if ((
int)a.size() <= 1)
return;
68 for (
int j = 0; j < v; ++j) {
70 a[j + v] = a[j] - ajv;
74 int u = 1 << (2 + (k & 1));
75 int v = 1 << (k - 2 - (k & 1));
85 for (; j0 < v; ++j0, ++j1, ++j2, ++j3) {
86 mint t0 = a[j0], t1 = a[j1], t2 = a[j2], t3 = a[j3];
87 mint t0p2 = t0 + t2, t1p3 = t1 + t3;
88 mint t0m2 = t0 - t2, t1m3 = (t1 - t3) * imag;
89 a[j0] = t0p2 + t1p3, a[j1] = t0p2 - t1p3;
90 a[j2] = t0m2 + t1m3, a[j3] = t0m2 - t1m3;
94 mint ww = one, xx = one * dw[2], wx = one;
95 for (
int jh = 4; jh < u;) {
96 ww = xx * xx, wx = ww * xx;
100 for (; j0 < je; ++j0, ++j2) {
101 mint t0 = a[j0], t1 = a[j0 + v] * xx, t2 = a[j2] * ww,
103 mint t0p2 = t0 + t2, t1p3 = t1 + t3;
104 mint t0m2 = t0 - t2, t1m3 = (t1 - t3) * imag;
105 a[j0] = t0p2 + t1p3, a[j0 + v] = t0p2 - t1p3;
106 a[j2] = t0m2 + t1m3, a[j2 + v] = t0m2 - t1m3;
108 xx *= dw[__builtin_ctzll((jh += 4))];
115 void ifft4(vector<mint> &a,
int k) {
116 if ((
int)a.size() <= 1)
return;
123 int u = 1 << (k - 2);
134 for (; j0 < v; ++j0, ++j1, ++j2, ++j3) {
135 mint t0 = a[j0], t1 = a[j1], t2 = a[j2], t3 = a[j3];
136 mint t0p1 = t0 + t1, t2p3 = t2 + t3;
137 mint t0m1 = t0 - t1, t2m3 = (t2 - t3) * imag;
138 a[j0] = t0p1 + t2p3, a[j2] = t0p1 - t2p3;
139 a[j1] = t0m1 + t2m3, a[j3] = t0m1 - t2m3;
143 mint ww = one, xx = one * dy[2], yy = one;
145 for (
int jh = 4; jh < u;) {
146 ww = xx * xx, yy = xx * imag;
150 for (; j0 < je; ++j0, ++j2) {
151 mint t0 = a[j0], t1 = a[j0 + v], t2 = a[j2], t3 = a[j2 + v];
152 mint t0p1 = t0 + t1, t2p3 = t2 + t3;
153 mint t0m1 = (t0 - t1) * xx, t2m3 = (t2 - t3) * yy;
154 a[j0] = t0p1 + t2p3, a[j2] = (t0p1 - t2p3) * ww;
155 a[j0 + v] = t0m1 + t2m3, a[j2 + v] = (t0m1 - t2m3) * ww;
157 xx *= dy[__builtin_ctzll(jh += 4)];
164 for (
int j = 0; j < u; ++j) {
165 mint ajv = a[j] - a[j + u];
172 void ntt(vector<mint> &a) {
173 if ((
int)a.size() <= 1)
return;
174 fft4(a, __builtin_ctz(a.size()));
178 if ((
int)a.size() <= 1)
return;
179 ifft4(a, __builtin_ctz(a.size()));
180 mint iv = mint(a.size()).inverse();
181 for (
auto &x : a) x *= iv;
185 int l = a.size() + b.size() - 1;
186 if (min<
int>(a.size(), b.size()) <= 40) {
188 for (
int i = 0; i < (
int)a.size(); ++i)
189 for (
int j = 0; j < (
int)b.size(); ++j) s[i + j] += a[i] * b[j];
193 while (M < l) M <<= 1, ++k;
196 for (
int i = 0; i < (
int)a.size(); ++i) s[i] = a[i];
198 if (a.size() == b.size() && a == b) {
199 for (
int i = 0; i < M; ++i) s[i] *= s[i];
202 for (
int i = 0; i < (
int)b.size(); ++i) t[i] = b[i];
204 for (
int i = 0; i < M; ++i) s[i] *= t[i];
208 mint invm = mint(M).inverse();
209 for (
int i = 0; i < l; ++i) s[i] *= invm;
214 int M = (
int)a.size();
217 mint r = 1, zeta = mint(pr).pow((mint::get_mod() - 1) / (M << 1));
218 for (
int i = 0; i < M; i++) b[i] *= r, r *= zeta;
220 copy(begin(b), end(b), back_inserter(a));
224template <
typename mint>
230 if (r.size() >
this->size())
this->resize(r.size());
231 for (
int i = 0; i < (
int)r.size(); i++) (*
this)[i] += r[i];
236 if (
this->empty())
this->resize(1);
242 if (r.size() >
this->size())
this->resize(r.size());
243 for (
int i = 0; i < (
int)r.size(); i++) (*
this)[i] -= r[i];
248 if (
this->empty())
this->resize(1);
254 for (
int k = 0; k < (
int)
this->size(); k++) (*
this)[k] *= v;
259 if (
this->size() < r.size()) {
263 int n =
this->size() - r.size() + 1;
264 if ((
int)r.size() <= 64) {
267 mint coeff = g.back().inverse();
268 for (
auto &x : g) x *= coeff;
269 int deg = (
int)f.size() - (
int)g.size() + 1;
272 for (
int i = deg - 1; i >= 0; i--) {
273 quo[i] = f[i + gs - 1];
274 for (
int j = 0; j < gs; j++) f[i + j] -= quo[i] * g[j];
277 this->resize(n, mint(0));
280 return *
this = ((*
this)
.rev().pre(n) * r
.rev().inv(n)).pre(n).rev();
284 *
this -= *
this / r * r;
289 FPS
operator+(
const FPS &r)
const {
return FPS(*
this) += r; }
290 FPS
operator+(
const mint &v)
const {
return FPS(*
this) += v; }
291 FPS
operator-(
const FPS &r)
const {
return FPS(*
this) -= r; }
292 FPS
operator-(
const mint &v)
const {
return FPS(*
this) -= v; }
293 FPS
operator*(
const FPS &r)
const {
return FPS(*
this) *= r; }
294 FPS
operator*(
const mint &v)
const {
return FPS(*
this) *= v; }
295 FPS
operator/(
const FPS &r)
const {
return FPS(*
this) /= r; }
296 FPS
operator%(
const FPS &r)
const {
return FPS(*
this) %= r; }
298 FPS ret(
this->size());
299 for (
int i = 0; i < (
int)
this->size(); i++) ret[i] = -(*
this)[i];
304 while (
this->size() &&
this->back() == mint(0))
this->pop_back();
309 reverse(begin(ret), end(ret));
314 FPS ret(min(
this->size(), r.size()));
315 for (
int i = 0; i < (
int)ret.size(); i++) ret[i] = (*
this)[i] * r[i];
321 FPS ret(begin(*
this), begin(*
this) + min((
int)
this->size(), sz));
322 if ((
int)ret.size() < sz) ret.resize(sz);
327 if ((
int)
this->size() <= sz)
return {};
329 ret.erase(ret.begin(), ret.begin() + sz);
333 FPS operator<<(
int sz)
const {
335 ret.insert(ret.begin(), sz, mint(0));
340 const int n = (
int)
this->size();
341 FPS ret(max(0, n - 1));
342 mint one(1), coeff(1);
343 for (
int i = 1; i < n; i++) {
344 ret[i - 1] = (*
this)[i] * coeff;
351 const int n = (
int)
this->size();
354 if (n > 0) ret[1] = mint(1);
355 auto mod = mint::get_mod();
356 for (
int i = 2; i <= n; i++) ret[i] = (-ret[mod % i]) * (mod / i);
357 for (
int i = 0; i < n; i++) ret[i + 1] *= (*
this)[i];
363 for (
auto &v : *
this) r += w * v, w *= x;
367 FPS
log(
int deg = -1)
const {
368 assert(!(*
this).empty() && (*
this)[0] == mint(1));
369 if (deg == -1) deg = (
int)
this->size();
373 FPS
pow(int64_t k,
int deg = -1)
const {
374 const int n = (
int)
this->size();
375 if (deg == -1) deg = n;
381 for (
int i = 0; i < n; i++) {
382 if ((*
this)[i] != mint(0)) {
383 mint rev = mint(1) / (*
this)[i];
384 FPS ret = (((*
this * rev) >> i).log(deg) * k).exp(deg);
385 ret *= (*
this)[i].pow(k);
386 ret = (ret << (i * k)).pre(deg);
387 if ((
int)ret.size() < deg) ret.resize(deg, mint(0));
390 if (__int128_t(i + 1) * k >= deg)
return FPS(deg, mint(0));
392 return FPS(deg, mint(0));
402 FPS
inv(
int deg = -1)
const;
403 FPS
exp(
int deg = -1)
const;
405template <
typename mint>
409
410
411
412#line 8
"fps/sparse-fps.hpp"
415template <
typename mint>
419 assert(g.empty() ==
false && g[0] != mint(0));
420 if (deg == -1) deg = f.size();
421 mint ig0 = g[0].inverse();
424 vector<pair<
int, mint>> gs;
425 for (
int i = 1; i < (
int)g.size(); i++) {
426 if (g[i] != 0) gs.emplace_back(i, g[i] * ig0);
428 for (
int i = 0; i < deg; i++) {
429 for (
auto& [j, g_j] : gs) {
430 if (i + j >= deg)
break;
431 s[i + j] -= s[i] * g_j;
437template <
typename mint>
440 assert(f.empty() ==
false && f[0] != mint(0));
441 if (deg == -1) deg = f.size();
442 vector<pair<
int, mint>> fs;
443 for (
int i = 1; i < (
int)f.size(); i++) {
444 if (f[i] != 0) fs.emplace_back(i, f[i]);
447 mint if0 = f[0].inverse();
448 if (0 < deg) g[0] = if0;
449 for (
int k = 1; k < deg; k++) {
450 for (
auto& [j, fj] : fs) {
452 g[k] += g[k - j] * fj;
459template <
typename mint>
462 assert(f.empty() ==
false && f[0] == 1);
463 if (deg == -1) deg = f.size();
464 vector<pair<
int, mint>> fs;
465 for (
int i = 1; i < (
int)f.size(); i++) {
466 if (f[i] != 0) fs.emplace_back(i, f[i]);
469 int mod = mint::get_mod();
470 static vector<mint> invs{1, 1};
471 while ((
int)invs.size() <= deg) {
473 invs.push_back((-invs[mod % i]) * (mod / i));
477 for (
int k = 0; k < deg - 1; k++) {
478 for (
auto& [j, fj] : fs) {
481 g[k + 1] -= g[i + 1] * fj * (i + 1);
483 g[k + 1] *= invs[k + 1];
484 if (k + 1 < (
int)f.size()) g[k + 1] += f[k + 1];
489template <
typename mint>
492 assert(f.empty()
or f[0] == 0);
493 if (deg == -1) deg = f.size();
494 vector<pair<
int, mint>> fs;
495 for (
int i = 1; i < (
int)f.size(); i++) {
496 if (f[i] != 0) fs.emplace_back(i, f[i]);
499 int mod = mint::get_mod();
500 static vector<mint> invs{1, 1};
501 while ((
int)invs.size() <= deg) {
503 invs.push_back((-invs[mod % i]) * (mod / i));
508 for (
int k = 0; k < deg - 1; k++) {
509 for (
auto& [ip1, fip1] : fs) {
512 g[k + 1] += fip1 * g[k - i] * (i + 1);
514 g[k + 1] *= invs[k + 1];
519template <
typename mint>
521 long long k,
int deg = -1) {
522 if (deg == -1) deg = f.size();
529 while (zero != (
int)f.size()
and f[zero] == 0) zero++;
530 if (zero == (
int)f.size()
or __int128_t(zero) * k >= deg) {
535 auto g = sparse_pow(suf, k, deg - zero * k);
537 copy(begin(g), end(g), back_inserter(h));
541 int mod = mint::get_mod();
542 static vector<mint> invs{1, 1};
543 while ((
int)invs.size() <= deg) {
545 invs.push_back((-invs[mod % i]) * (mod / i));
548 vector<pair<
int, mint>> fs;
549 for (
int i = 1; i < (
int)f.size(); i++) {
550 if (f[i] != 0) fs.emplace_back(i, f[i]);
555 mint denom = f[0].inverse();
556 k %= mint::get_mod();
557 for (
int a = 1; a < deg; a++) {
558 for (
auto& [i, f_i] : fs) {
560 g[a] += f_i * g[a - i] * ((k + 1) * i - a);
562 g[a] *= denom * invs[a];
567template <
typename mint>
572template <
typename mint>
575 if (
this->empty() || r.empty()) {
580 auto ret =
static_cast<
NTT<mint>*>(
ntt_ptr)->multiply(*
this, r);
584template <
typename mint>
590template <
typename mint>
593 static_cast<
NTT<mint>*>(
ntt_ptr)->intt(*
this);
596template <
typename mint>
599 static_cast<
NTT<mint>*>(
ntt_ptr)->ntt_doubling(*
this);
602template <
typename mint>
608template <
typename mint>
610 assert((*
this)[0] != mint(0));
611 if (deg == -1) deg = (
int)
this->size();
613 res[0] = {mint(1) / (*
this)[0]};
614 for (
int d = 1; d < deg; d <<= 1) {
616 for (
int j = 0; j < min((
int)
this->size(), 2 * d); j++) f[j] = (*
this)[j];
617 for (
int j = 0; j < d; j++) g[j] = res[j];
620 for (
int j = 0; j < 2 * d; j++) f[j] *= g[j];
622 for (
int j = 0; j < d; j++) f[j] = 0;
624 for (
int j = 0; j < 2 * d; j++) f[j] *= g[j];
626 for (
int j = d; j < min(2 * d, deg); j++) res[j] = -f[j];
631template <
typename mint>
634 assert((*
this).size() == 0 || (*
this)[0] == mint(0));
635 if (deg == -1) deg =
this->size();
638 inv.reserve(deg + 1);
639 inv.push_back(mint(0));
640 inv.push_back(mint(1));
642 auto inplace_integral = [&](fps& F) ->
void {
643 const int n = (
int)F.size();
644 auto mod = mint::get_mod();
645 while ((
int)inv.size() <= n) {
647 inv.push_back((-inv[mod % i]) * (mod / i));
649 F.insert(begin(F), mint(0));
650 for (
int i = 1; i <= n; i++) F[i] *= inv[i];
653 auto inplace_diff = [](fps& F) ->
void {
654 if (F.empty())
return;
656 mint coeff = 1, one = 1;
657 for (
int i = 0; i < (
int)F.size(); i++) {
663 fps b{1, 1 < (
int)
this->size() ? (*
this)[1] : 0}, c{1}, z1, z2{1, 1};
664 for (
int m = 2; m < deg; m *= 2) {
670 for (
int i = 0; i < m; ++i) z[i] = y[i] * z1[i];
672 fill(begin(z), begin(z) + m / 2, mint(0));
674 for (
int i = 0; i < m; ++i) z[i] *= -z1[i];
676 c.insert(end(c), begin(z) + m / 2, end(z));
680 fps x(begin(*
this), begin(*
this) + min<
int>(
this->size(), m));
683 x.push_back(mint(0));
685 for (
int i = 0; i < m; ++i) x[i] *= y[i];
689 for (
int i = 0; i < m - 1; ++i) x[m + i] = x[i], x[i] = mint(0);
691 for (
int i = 0; i < 2 * m; ++i) x[i] *= z2[i];
695 for (
int i = m; i < min<
int>(
this->size(), 2 * m); ++i) x[i] += (*
this)[i];
696 fill(begin(x), begin(x) + m, mint(0));
698 for (
int i = 0; i < 2 * m; ++i) x[i] *= y[i];
700 b.insert(end(b), begin(x) + m, end(x));
702 return fps{begin(b), begin(b) + deg};
707template <
typename mint>
709 if (deg == -1) deg = (
int)f.size();
711 if (f[0] == mint(0)) {
712 for (
int i = 1; i < (
int)f.size(); i++) {
713 if (f[i] != mint(0)) {
714 if (i & 1)
return {};
715 if (deg - i / 2 <= 0)
break;
716 auto ret = sqrt(f >> i, deg - i / 2);
717 if (ret.empty())
return {};
718 ret = ret << (i / 2);
719 if ((
int)ret.size() < deg) ret.resize(deg, mint(0));
726 int64_t sqr = mod_sqrt(f[0].get(), mint::get_mod());
727 if (sqr == -1)
return {};
728 assert(sqr * sqr % mint::get_mod() == f[0].get());
730 mint inv2 = mint(2).inverse();
731 for (
int i = 1; i < deg; i <<= 1) {
732 ret = (ret + f.pre(i << 1) * ret.inv(i << 1)) * inv2;
737template <
typename mint>
742 assert(fre.size() == 0 || fre[0] == mint(0));
743 assert(fim.size() == 0 || fim[0] == mint(0));
744 if (deg == -1) deg = (
int)max(fre.size(), fim.size());
745 fps re({mint(1)}), im({mint(0)});
748 if (fps::ntt_ptr ==
nullptr) {
749 for (
int i = 1; i < deg; i <<= 1) {
752 fps fhypot = (re * re + im * im).inv(i << 1);
753 fps ere = dre * re + dim * im;
754 fps eim = dim * re - dre * im;
755 fps logre = (ere * fhypot).pre((i << 1) - 1).integral();
756 fps logim = (eim * fhypot).pre((i << 1) - 1).integral();
757 fps gre = (-logre) + mint(1) - fim.pre(i << 1);
758 fps gim = (-logim) + fre.pre(i << 1);
759 fps hre = (re * gre - im * gim).pre(i << 1);
760 fps him = (re * gim + im * gre).pre(i << 1);
765 for (
int i = 1; i < deg; i <<= 1) {
776 fps fhypot(i << 1), ere(i << 1), eim(i << 1);
777 for (
int j = 0; j < 2 * i; j++) {
778 fhypot[j] = re[j] * re[j] + im[j] * im[j];
779 ere[j] = dre[j] * re[j] + dim[j] * im[j];
780 eim[j] = dim[j] * re[j] - dre[j] * im[j];
783 fhypot = fhypot.inv(i << 1);
784 fhypot.resize(i << 2);
788 fps logre(i << 2), logim(i << 2);
789 for (
int j = 0; j < 4 * i; j++) {
790 logre[j] = ere[j] * fhypot[j];
791 logim[j] = eim[j] * fhypot[j];
795 logre = logre.pre((i << 1) - 1).integral();
796 logim = logim.pre((i << 1) - 1).integral();
797 fps gre = (-logre) + mint(1) - fim.pre(i << 1);
798 fps gim = (-logim) + fre.pre(i << 1);
805 fps hre(i << 2), him(i << 2);
806 for (
int j = 0; j < 4 * i; j++) {
807 hre[j] = re[j] * gre[j] - im[j] * gim[j];
808 him[j] = re[j] * gim[j] + im[j] * gre[j];
812 hre = hre.pre(i << 1);
813 him = him.pre(i << 1);
818 return make_pair(re.pre(deg), im.pre(deg));
822template <
typename mint>
827 for (
int i = 0; i < N; i++) f[i] *= C.fac(i);
828 reverse(begin(f), end(f));
830 for (
int i = 1; i < N; i++) g[i] = g[i - 1] * a * C.inv(i);
832 reverse(begin(f), end(f));
833 for (
int i = 0; i < N; i++) f[i] *= C.finv(i);
FormalPowerSeries< mint > sparse_exp(const FormalPowerSeries< mint > &f, int deg=-1)
FormalPowerSeries< mint > sparse_div(const FormalPowerSeries< mint > &f, const FormalPowerSeries< mint > &g, int deg=-1)
多項式/形式的冪級数ライブラリ @docs docs/fps/formal-power-series.md
FormalPowerSeries< mint > sqrt(const FormalPowerSeries< mint > &f, int deg=-1)
FormalPowerSeries< mint > sparse_log(const FormalPowerSeries< mint > &f, int deg=-1)
pair< FormalPowerSeries< mint >, FormalPowerSeries< mint > > circular(const FormalPowerSeries< mint > &fre, const FormalPowerSeries< mint > &fim, int deg=-1)
FormalPowerSeries< mint > TaylorShift(FormalPowerSeries< mint > f, mint a, Binomial< mint > &C)
FormalPowerSeries< mint > sparse_inv(const FormalPowerSeries< mint > &f, int deg=-1)
FormalPowerSeries< mint > sparse_pow(const FormalPowerSeries< mint > &f, long long k, int deg=-1)
void ntt(vector< mint > &a)
static constexpr uint32_t mod
void intt(vector< mint > &a)
void fft4(vector< mint > &a, int k)
void ifft4(vector< mint > &a, int k)
static constexpr uint32_t pr
vector< mint > multiply(const vector< mint > &a, const vector< mint > &b)
void ntt_doubling(vector< mint > &a)
static constexpr int level
static constexpr uint32_t get_pr()