#include using namespace std; #define FOR(i,l,r) for(long long i=(l);i<(r);++i) #define REP(i,n) FOR(i,0,n) #define REPS(i,n) FOR(i,1,n+1) #define RFOR(i,l,r) for(long long i=(l);i>=(r);--i) #define RREP(i,n) RFOR(i,n-1,0) #define RREPS(i,n) RFOR(i,n,1) #define int long long #define mp make_pair #define pb push_back #define eb emplace_back #define SZ(x) ((int)(x).size()) #define all(x) (x).begin(),(x).end() #define rall(x) (x).rbegin(),(x).rend() template inline bool chmin(T& a, T b) {if (a > b) {a = b; return true; }return false; } template inline bool chmax(T& a, T b) {if (a < b) {a = b; return true; }return false; } const int INF = 1e18; const int MOD = 1e9+7; // const int MOD = 998244353; const int MAX = 1000010; int fac[MAX],finv[MAX],inv[MAX]; //テーブル作成 void COMinit(){ fac[0]=fac[1]=1; finv[0]=finv[1]=1; inv[1]=1; for(int i=2;i T pow(T a, long long n, T e = 1) { T ret = e; while (n) { if (n & 1) ret *= a; a *= a; n >>= 1; } return ret; } template struct ModInt { int x; ModInt() : x(0) {} ModInt(long long x_) { if ((x = x_ % mod + mod) >= mod) x -= mod; } ModInt& operator+=(ModInt rhs) { if ((x += rhs.x) >= mod) x -= mod; return *this; } ModInt& operator-=(ModInt rhs) { if ((x -= rhs.x) < 0) x += mod; return *this; } ModInt& operator*=(ModInt rhs) { x = (unsigned long long)x * rhs.x % mod; return *this; } ModInt& operator/=(ModInt rhs) { x = (unsigned long long)x * rhs.inv().x % mod; return *this; } ModInt operator-() const { return -x < 0 ? mod - x : -x; } ModInt operator+(ModInt rhs) const { return ModInt(*this) += rhs; } ModInt operator-(ModInt rhs) const { return ModInt(*this) -= rhs; } ModInt operator*(ModInt rhs) const { return ModInt(*this) *= rhs; } ModInt operator/(ModInt rhs) const { return ModInt(*this) /= rhs; } bool operator==(ModInt rhs) const { return x == rhs.x; } bool operator!=(ModInt rhs) const { return x != rhs.x; } ModInt inv() const { return pow(*this, mod - 2); } friend ostream& operator<<(ostream& s, ModInt a) { s << a.x; return s; } friend istream& operator>>(istream& s, ModInt& a) { s >> a.x; return s; } }; using mint = ModInt; int Roundup_div(int x, int y) {return (x+(y-1))/y;} mint ans = 1 ,bef = 1; signed main(){ int n; cin >> n; vector a(n); vector b(n); vector c(n); vector rui(n); REP(i,n){ cin >> b[i]; if(!b[i]){ cout << 0 << endl; return 0; } } REP(i,n) a[i] = (mint)b[i]; REP(i,n){ if(!i){ c[i] = pow(a[i],n-i); rui[i] = a[i]; } else{ c[i] = c[i-1] * pow(a[i],n-i); rui[i] = rui[i-1] * a[i]; } } int right = 0; int mul = 1; REP(left,n){ while(right < n and mul*b[right] < 1e9){ mul *= b[right]; right ++; } if(!left){ ans *= c[right-1]; ans /= pow(rui[right-1],n-right); } else{ ans *= c[right-1] / c[left-1]; ans /= pow(rui[right-1]/rui[left-1],n-right); } if(right == left)right++; else mul /= b[left]; } cout << ans << endl; }