#include using namespace std; #define Loop(x,l,r) for (ll x = ll(l); x < ll(r); ++x) #define LoopR(x,l,r) for (ll x = ll(r)-1; x >= ll(l); --x) #define Looc(x,l,r) for (ll x = ll(l); x <= ll(r); ++x) #define LoocR(x,l,r) for (ll x = ll(r); x >= ll(l); --x) #define int ll typedef long long ll; typedef pair pii; typedef pair pll; #ifndef DB #define DB 0 #define endl '\n' #endif #define debugl(l) if constexpr ((l) < DB) #define debug debugl(0) const int mod = 998244353; ll pw(ll x, ll y) { ll a = 1; x = (x%mod+mod)%mod; while (y) { if (y%2) a = a*x % mod; x = x*x % mod; y /= 2; } return a; } ll inv(ll x) { return pw(x, mod-2); } int w[24], wi[24], inv2n[24]; typedef vector vec; void ntt(ll *a, int lg, bool inverse = 0) { int n = 1< rev(n); Loop (i,1,n) { rev[i] = (rev[i/2]>>1) ^ ((i&1)<<(lg-1)); if (i < rev[i]) swap(a[i], a[rev[i]]); } Loop (r,1,n+1) { int mx = __builtin_ctz(r); Loop (lz,0,mx) { int len = 1< n) return 0; return fct[n] * fci[r] % mod * fci[n-r] % mod; } struct poly { ll lambda; vec a; ll eval() { ll sum = 0; ll invi = inv(lambda); ll pwi = invi; Loop (j,0,a.size()) { sum = (sum + a[j] * fct[j] % mod * pwi) % mod; pwi = pwi * invi % mod; } return sum; } }; poly operator*(const poly &a, const poly &b) { return { (a.lambda + b.lambda) % mod, mul(a.a, b.a), }; } void solve() { int n; cin >> n; vector k(n), a(n); Loop (i,0,n) cin >> k[i] >> a[i]; Loop (i,0,n) a[i] = inv(a[i]); vector ps(1< eval(1< ans(n+1); Loop (inc_msk,0,1< sync_with_stdio(false); int t = 1; //cin >> t; while (t--) solve(); }