#include<bits/stdc++.h>
using namespace std;
template<typename T>inline T read(){
	T f=0,x=0;char c=getchar();
	while(!isdigit(c)) f=c=='-',c=getchar();
	while(isdigit(c)) x=x*10+c-48,c=getchar();
	return f?-x:x;
}
namespace run{
	const int N=409,mod=998244353;
	inline int add(int x,int y){return x+y>=mod?x-mod+y:x+y;}
	inline void addto(int &x,int y){x=x+y>=mod?x-mod+y:x+y;}
	inline int sub(int x,int y){return x>=y?x-y:x+mod-y;}
	inline void subto(int &x,int y){x=x>=y?x-y:x+mod-y;}
	inline int qpow(int x,int y){
		int ret=1;
		while(y){
			if(y&1) ret=1LL*x*ret%mod;
			x=1LL*x*x%mod,y>>=1;
		}
		return ret;
	}

	int n,A[N],B[N],f[2][N][N],cur,pre,SA,SB,inv[N];
	int main(){
		n=read<int>();
		for(int i=1;i<=n;i++) A[i]=read<int>(),B[i]=read<int>();
		inv[0]=inv[1]=1;
		for(int i=2;i<N;i++) inv[i]=1LL*(mod-mod/i)*inv[mod%i]%mod;

		f[cur][0][0]=mod-1;
		for(int i=1;i<=n;i++){
			pre=cur,cur^=1;
			memset(f[cur],0,sizeof f[cur]);
			for(int j=0;j<=SA;j++)
				for(int k=0;k<=SB;k++){
					addto(f[cur][j][k],f[pre][j][k]);
					int ifac=1,pw=1;
					for(int p=0;p<B[i];p++){
						subto(f[cur][j+A[i]][k+p],1LL*f[pre][j][k]*ifac%mod*pw%mod);
						ifac=1LL*ifac*inv[p+1]%mod,pw=1LL*pw*A[i]%mod;
					}
				}
			SA+=A[i],SB+=B[i]-1;
		}

		int ans=0;
		for(int j=1;j<=SA;j++){
			int fac=1,pw=1;
			for(int k=0;k<=SB;k++){
				addto(ans,1LL*f[cur][j][k]*fac%mod*pw%mod*SA%mod*inv[j]%mod);
				fac=1LL*fac*(k+1)%mod,pw=1LL*pw*inv[j]%mod;
			}
		}
		printf("%d\n",ans);
		return 0;
	}
}
int main(){
#ifdef my
	freopen(".in","r",stdin);
	freopen(".out","w",stdout);
#endif
	return run::main();
}