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;