#include <iostream> #include <vector> using namespace std; const int MOD = 998244353; const int N = 100000002; // 配列サイズ (注意: メモリに十分な容量が必要) // 階乗とその逆元を保持する配列 vector<long long> F(N, 1); // 高速累乗法 long long mod_pow(long long base, long long exp, long long mod) { long long result = 1; while (exp > 0) { if (exp % 2 == 1) { result = result * base % mod; } base = base * base % mod; exp /= 2; } return result; } // 組み合わせ計算関数 long long comb(long long a, long long b) { if (b < 0 || a < b) return 0; return F[a] * mod_pow(F[b], MOD - 2, MOD) % MOD * mod_pow(F[a - b], MOD - 2, MOD) % MOD; } int main() { // 階乗の前計算 for (int i = 2; i < N; i++) { F[i] = F[i - 1] * i % MOD; } long long ans = 1; int k; cin >> k; long long cnt = 0; for (int t = 0; t < k; t++) { long long l, m; cin >> l >> m; long long tmp = 1; for (int i = 0; i < m; i++) { tmp = comb(l * (i + 1) - 1, l - 1) * tmp % MOD; } ans = ans * tmp % MOD * comb(l * m + cnt, cnt) % MOD; cnt += l * m; } cout << ans << endl; return 0; }