#include using namespace std; typedef long long ll; #define REP(i,n) for(int i=0,_n=(int)(n);i<_n;++i) #define ALL(v) (v).begin(),(v).end() #define CLR(t,v) memset(t,(v),sizeof(t)) templateostream& operator<<(ostream& os,const pair&a){return os<<"("<void pv(T a,T b){for(T i=a;i!=b;++i)cout<<(*i)<<" ";cout<void chmin(T&a,const T&b){if(a>b)a=b;} templatevoid chmax(T&a,const T&b){if(a 0) { if (b & 1) res = (res * a) % p; a = (a * a) % p; b >>= 1; } return res; } ll mod_inv(ll a, ll p = MOD) { return mod_pow(a % p, p - 2, p); } ll solve(vector A) { A.push_back(BIG+1); // pv(ALL(A)); const int N = A.size(); ll res = 1; ll w = 1; // A[a]^1 * a[a+1]^2 * ... * A[b-1]^(b-a) ll prod = 1; int a = 0, b = 0; while (a < N) { int type = 0; if (b == N) { type = 1; } else if (prod >= BIG) { type = 1; } if (type == 0) { prod *= A[b]; w *= mod_pow(A[b], (b - a + 1)); w %= MOD; b++; } else { w *= mod_inv(prod); w %= MOD; prod /= A[a]; a++; } // cout << "[" << a << " " << b << "] " << prod << " " << w << endl; if (prod < BIG) { res = (res * w) % MOD; } } return res; } int main2() { int N = nextLong(); vector A(N); REP(i, N) A[i] = nextLong(); if (count(ALL(A), 0) > 0) { cout << 0 << endl; return 0; } ll ans = solve(A); cout << ans << endl; return 0; } int main() { #ifdef LOCAL for (;!cin.eof();cin>>ws) #endif main2(); return 0; }