#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;
}