""" https://yukicoder.me/problems/no/1001 包除原理らしい? とりあえず、t=0 は絶対満たすようにする。 t=1を包除すると考えると、奇数個確定で違反する場合に負の寄与になるようにすればいいか X順でsortして、dp[i][k] = i番目まで決めて、k個は確定で違反しているときの場合の数 で、最後に足し合わせればok? 3 0 1 1 1 1 2 """ mod = 10**9+7 N = int(input()) fac = [1,1] for i in range(2,N+10): fac.append(fac[-1] * i % mod) Xt = [] tsum = 0 for i in range(N): t,X = map(int,input().split()) if t == 1: X -= 1 Xt.append( (X,t) ) tsum += t Xt.sort() dp = [0] * (tsum+1) dp[0] = 1 tsum = 0 for i in range(N): X,t = Xt[i] ndp = [0] * len(dp) last_zero = i - tsum if t == 0: for j in range(len(dp)): ndp[j] += dp[j] * (X-last_zero-j) ndp[j] %= mod else: for j in range(len(dp)): ndp[j] += dp[j] ndp[j] %= mod if j != len(dp)-1: ndp[j+1] += dp[j] * (X-last_zero-j) ndp[j+1] %= mod tsum += t dp = ndp #print (dp) for i in range(len(dp)): dp[i] *= fac[tsum-i] dp[i] %= mod #print (dp) ans = 0 for i in range(len(dp)): if i % 2 == 0: ans += dp[i] else: ans -= dp[i] ans %= mod print (ans)