#include #include #include using namespace std; using ll = long long; ll mod = 1e9+7; struct Matrix{ int r, c; vector> a; Matrix(int r, int c) :r(r), c(c), a(r, vector(c, 0)){} static Matrix iden(int n){ //正方行列限定 Matrix I(n, n); for(int i=0; i=mod) a[i][j]-=mod; } return *this; } Matrix& operator-=(const Matrix& rhs) { //assert(r==rhs.r&&c==rhs.c); for(int i=0; i mul_vec(const vector& v) const { //assert(c == (int)v.size()); vector res(r, 0); for(int i=0;i>=1; } return R; } ll modpow(ll a, ll b, ll p){ a%=p; ll ans=1; while(b>0){ if(b%2==1) ans=(ans*a)%p; b/=2; a=(a*a)%p; } return ans; } int main(void){ int n; cin >> n; ll ans=1, m=mod-1; Matrix A(2, 2); A.a={{1, 1}, {1, 0}}; vector v={1, 0}; while(n--){ ll c; cin >> c; string d; cin >> d; ll r=0; for(auto p:d){ int now=p-'0'; r=(r*10+now)%m; } auto B=pow(A, c); auto u=B.mul_vec(v); ll x=u[0]+u[1]; x%=mod; ans*=modpow(x, r, mod), ans%=mod; } cout << ans << endl; return 0; }