MInt

constexpr int P = 998244353;
template<class T>
T power(T a, i64 b) {
T res = 1;
for (; b; b = b / 2, a = a * a) {
if (b % 2) {
res = res * a;
}
}
return res;
}
struct MInt {
int x;
MInt() : x{} {}
MInt(i64 x) : x{norm(x % P)} {}
int norm(int x) {
if (x < 0) {
x += P;
}
if (x >= P) {
x -= P;
}
return x;
}
explicit operator int() {
return x;
}
MInt inv() {
assert(x != 0);
return power(*this, P - 2);
}
friend MInt operator*(MInt lhs, MInt rhs) {
MInt res = lhs;
res.x = 1LL * res.x * rhs.x % P;
return res;
}
friend MInt operator+(MInt lhs, MInt rhs) {
MInt res = lhs;
res.x = res.norm(res.x + rhs.x);
return res;
}
friend MInt operator-(MInt lhs, MInt rhs) {
MInt res = lhs;
res.x = res.norm(res.x - rhs.x);
return res;
}
friend MInt operator/(MInt lhs, MInt rhs) {
MInt res = lhs;
res = res * rhs.inv();
return res;
}
friend istream &operator>>(istream &is, MInt &a) {
i64 v;
is >> v;
a = MInt(v);
return is;
}
friend ostream &operator<<(ostream &os, MInt &a) {
return os << a.x;
}
friend bool operator==(MInt lhs, MInt rhs) {
return lhs.x == rhs.x;
}
friend bool operator!=(MInt lhs, MInt rhs) {
return lhs.x != rhs.x;
}
};
using Z = MInt;