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