#include <bits/stdc++.h>
#pragma GCC optimize ("O2,unroll-loops")
//#pragma GCC optimize("no-stack-protector,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")

using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<pii, int> piii;
typedef pair<ll, ll> pll;
#define debug(x) cerr<<#x<<'='<<(x)<<endl;
#define debugp(x) cerr<<#x<<"= {"<<(x.first)<<", "<<(x.second)<<"}"<<endl;
#define debug2(x, y) cerr<<"{"<<#x<<", "<<#y<<"} = {"<<(x)<<", "<<(y)<<"}"<<endl;
#define debugv(v) {cerr<<#v<<" : ";for (auto x:v) cerr<<x<<' ';cerr<<endl;}
#define all(x) x.begin(), x.end()
#define pb push_back
#define kill(x) return cout<<x<<'\n', 0;

const int inf=1000000010;
const ll INF=10000000000000010LL;
const int mod=998244353;
const int N=405;

ll n, m, k, u, v, x, y, t, a, b, ans, sum;
ll A[N], B[N];
ll F[N], I[N];
ll dp[N][N][N];

ll powmod(ll a, ll b){
	ll res=1;
	for (; b; b>>=1, a=a*a%mod) if (b&1) res=res*a%mod;
	return res;
}

int main(){
	ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	//freopen("input.txt", "r", stdin);
	//freopen("output.txt", "w", stdout);
	F[0]=1;
	for (int i=1; i<N; i++) F[i]=F[i-1]*i%mod;
	I[N-1]=powmod(F[N-1], mod-2);
	for (int i=N-1; i; i--) I[i-1]=I[i]*i%mod;
	cin>>n;
	for (int i=1; i<=n; i++) cin>>A[i]>>B[i], sum+=A[i];
	dp[0][0][0]=-1;
	int sumb=0;
	for (int i=1; i<=n; i++){
		ll p=A[i]*powmod(sum, mod-2)%mod;
		sumb+=B[i]-1;
		for (int sa=0; sa<=sum; sa++){
			for (int sx=0; sx<=sumb; sx++){
				int lim=min(sx, (int)B[i]-1);
				ll tmp=0, mul=1;
				if (sa>=A[i]){
					for (int j=0; j<=lim; j++){
						tmp=(tmp + dp[i-1][sa-A[i]][sx-j]*mul%mod*I[j])%mod;
						mul=mul*p%mod;
					}
				}
				dp[i][sa][sx]=(dp[i-1][sa][sx] - tmp)%mod;
			}
		}
	}
	for (int sa=1; sa<=sum; sa++) for (int sx=0; sx<=sumb; sx++){
		ll val=sa*powmod(sum, mod-2)%mod;
		val=powmod(val, mod-1-sx-1)*F[sx]%mod;
		ans=(ans + dp[n][sa][sx]*val)%mod;
	}
	if (ans<0) ans+=mod;
	cout<<ans<<"\n";
	
	return 0;
}
