import sys from operator import itemgetter from collections import defaultdict, deque import heapq import bisect import math import itertools import copy stdin=sys.stdin sys.setrecursionlimit(10 ** 8) ip=lambda: int(sp()) fp=lambda: float(sp()) lp=lambda:list(map(int,stdin.readline().split())) sp=lambda:stdin.readline().rstrip() Yp=lambda:print('Yes') Np=lambda:print('No') inf = 1 << 60 inf = float('inf') mod = 10 ** 9 + 7 #mod = 998244353 eps = 1e-9 sortkey1 = itemgetter(0) sortkey2 = lambda x: (x[0], x[1]) ############################################################### L = ip() primes = [lp() for _ in range(L)] ans = 1 for p, e in primes: x = pow(p, e + 2, mod) - 1 y = pow(p - 1, mod - 2, mod) res = (x * y - (e + 2)) * y res %= mod ans *= res ans %= mod print(ans)