#include #define REP(i, a, n) for(ll i = ((ll) a); i < ((ll) n); i++) #define MOD 1000000007LL using namespace std; typedef long long ll; typedef vector vec; typedef vector mat; ll N, C[30000]; string D[30000]; mat mul(mat &A, mat &B) { mat C(A.size(), vector(B[0].size())); REP(i, 0, A.size()) { REP(j, 0, B[0].size()) { REP(k, 0, B.size()) { C[i][j] = (C[i][j] + A[i][k] * B[k][j]) % MOD; } } } return C; } mat pow(mat A, ll n) { mat B(A.size(), vec(A.size())); REP(i, 0, A.size()) B[i][i] = 1; while(n > 0) { if(n & 1) B = mul(B, A); A = mul(A, A); n >>= 1; } return B; } ll modulo_power(ll a, ll n) { if(n == 0) return 1; if(n % 2 == 0) return modulo_power((a * a) % MOD, n / 2); return (a * modulo_power(a, n - 1)) % MOD; } ll powi(ll x, string const &d) { ll y = 1; ll n = d.size(); for(ll i = d.size() - 1; i >= 0; i--) { ll c = d[i] - '0'; ll z = 1; REP(j, 0, 10) { if(j == c) y = (y * z) % MOD; z = (z * x) % MOD; } x = z; } return y; } int main(void) { cin >> N; REP(i, 0, N) cin >> C[i] >> D[i]; ll ans = 1; REP(i, 0, N) { mat A(2, vec(2)); A[0][0] = 1; A[0][1] = 1; A[1][0] = 1; A[1][1] = 0; ans = (ans * powi(pow(A, C[i] + 2)[0][1], D[i])) % MOD; } cout << ans << endl; }