Skip to content

Commit 246b47c

Browse files
committed
add FPS
1 parent a134c1b commit 246b47c

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ AtCoder解説放送ライブラリ集
2626
|Combination|[comb.cpp](comb.cpp)|nCkをmod素数で求める|
2727
|Matrix|[mat.cpp](mat.cpp)|行列|
2828
|素数|[prime.cpp](prime.cpp)|素数列挙と素因数分解|
29+
|FPS|[fps.cpp](fps.cpp)|形式的べき級数|
2930

3031
### グラフ
3132
|名前|コード|説明|

fps.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
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

Comments
 (0)