Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 536f7a7

Browse files
committed
add fps.inv
1 parent ef80eea commit 536f7a7

File tree

1 file changed

+11
-2
lines changed

1 file changed

+11
-2
lines changed

‎fps.cpp‎

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ struct fps : vm {
66
template<class...Args> fps(Args...args): vm(args...) {}
77
fps(initializer_list<mint> a): vm(a.begin(),a.end()) {}
88
void rsz(int n) { if (s < n) resize(n);}
9+
fps& low_(int n) { resize(n); return d;}
10+
fps low(int n) const { return fps(d).low_(n);}
911
mint& operator[](int i) { rsz(i+1); return vm::operator[](i);}
1012
mint operator[](int i) const { return i<s ? vm::operator[](i) : 0;}
1113
mint operator()(mint x) const {
@@ -17,13 +19,20 @@ struct fps : vm {
1719
fps& operator+=(const fps& a) { rsz(a.size()); rep(i,a.size()) d[i] += a[i]; return d;}
1820
fps& operator-=(const fps& a) { rsz(a.size()); rep(i,a.size()) d[i] -= a[i]; return d;}
1921
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*=(mint a) { rep(i,s) d[i] *= a; return d;}
23+
fps& operator/=(mint a) { rep(i,s) d[i] /= a; return d;}
2224
fps operator+(const fps& a) const { return fps(d) += a;}
2325
fps operator-(const fps& a) const { return fps(d) -= a;}
2426
fps operator*(const fps& a) const { return fps(d) *= a;}
2527
fps operator*(mint a) const { return fps(d) *= a;}
2628
fps operator/(mint a) const { return fps(d) /= a;}
29+
fps operator~() const {
30+
fps r({d[0].inv()});
31+
for (int i = 1; i < s; i <<= 1) r = r*mint(2) - (r*r*low(i<<1)).low(i<<1);
32+
return r.low_(s);
33+
}
34+
fps& operator/=(const fps& a) { int w = s; d *= ~a; return d.low_(w);}
35+
fps operator/(const fps& a) const { return fps(d) /= a;}
2736
fps integ() const {
2837
fps r;
2938
rep(i,s) r[i+1] = d[i]/(i+1);

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /