1+ // Formal Power Series
2+ using vm = vector<mint>;
3+ struct fps : vm {
4+ #define d (*this )
5+ #define s int (vm::size())
6+ template<class...Args> fps(Args...args): vm(args...) {}
7+ fps (initializer_list<mint> a): vm(a.begin(),a.end()) {}
8+ void rsz (int n) { if (s < n) resize (n);}
9+ mint& operator [](int i) { rsz (i+1 ); return vm::operator [](i);}
10+ mint operator [](int i) const { return i<s ? vm::operator [](i) : 0 ;}
11+ mint operator ()(mint x) const {
12+ mint r;
13+ for (int i = s-1 ; i >= 0 ; --i) r = r*x+d[i];
14+ return r;
15+ }
16+ fps operator -() const { fps r (d); rep (i,s) r[i] = -r[i]; return r;}
17+ fps& operator +=(const fps& a) { rsz (a.size ()); rep (i,a.size ()) d[i] += a[i]; return d;}
18+ fps& operator -=(const fps& a) { rsz (a.size ()); rep (i,a.size ()) d[i] -= a[i]; return d;}
19+ fps& operator *=(const fps& a) { return d = convolution (d, a);}
20+ fps& operator *=(mint a) { rep (i,s) d[i] *= a; return *this ;}
21+ fps& operator /=(mint a) { rep (i,s) d[i] /= a; return *this ;}
22+ fps operator +(const fps& a) const { return fps (d) += a;}
23+ fps operator -(const fps& a) const { return fps (d) -= a;}
24+ fps operator *(const fps& a) const { return fps (d) *= a;}
25+ fps operator *(mint a) const { return fps (d) *= a;}
26+ fps operator /(mint a) const { return fps (d) /= a;}
27+ fps integ () const {
28+ fps r;
29+ rep (i,s) r[i+1 ] = d[i]/(i+1 );
30+ return r;
31+ }
32+ #undef s
33+ #undef d
34+ };
35+ ostream& operator <<(ostream&o,const fps&a) {
36+ rep (i,a.size ()) o<<(i?" " :" " )<<a[i].val ();
37+ return o;
38+ }
0 commit comments