const int mod = 1e9 + 7;
struct mint{
mint(){}
mint(int _k){
k = _k;
}
int k;
mint & operator = (const int &_k){
k = _k;
return *this;
}
friend mint operator + (const mint &x, const mint &y){
mint z = x.k + y.k;
if(z.k >= mod) z.k -= mod;
return z;
}
friend mint operator - (const mint &x, const mint &y){
mint z = x.k - y.k;
if(z.k < 0) z.k += mod;
return z;
}
friend mint operator * (const mint &x, const mint &y){
mint z = 1ll * x.k * y.k % mod;
return z;
}
friend mint operator / (const mint &x, const mint &y){
mint z = 1ll * x.k * (y ^ (mod - 2) ).k % mod;
return z;
}
friend mint operator ^ (mint a, int b){
mint res = 1;
while(b){
if(b & 1) res = res * a;
a = a * a;
b >>= 1;
}
return res;
}
};
const int mod = 998244353;
int inc(int x) { return x; }
int mul(int x) { return x; }
template<class ...Args>
int inc(int x, Args... y) { return (x += inc(y...) ) >= mod ? x - mod : x; }
template<class ...Args>
int dec(int x, Args... y) { return (x -= inc(y...) ) < 0 ? x + mod : x; }
template<class ...Args>
int mul(int x, Args... y) { return 1ll * x * mul(y...) % mod; }
int qpow(int a, ll b) {
int res = 1;
while(b) {
if(b & 1) res = mul(res, a);
a = mul(a, a);
b >>= 1;
}
return res;
}
namespace Comb {
vector<int> fac, ifac, inv;
int C(int x, int y) {
if(y > x || y < 0) return 0;
return mul(fac[x], ifac[x - y], ifac[y]);
}
void init(int N) {
fac.resize(N + 1);
ifac.resize(N + 1);
inv.resize(N + 1);
fac[1] = ifac[1] = ifac[0] = fac[0] = inv[1] = 1;
for(int i = 2; i <= N; ++i) {
fac[i] = mul(fac[i - 1], i);
inv[i] = mul(mod - mod / i, inv[mod % i]);
ifac[i] = mul(ifac[i - 1], inv[i]);
}
}
}