#include #include #include #include #include #include #include #include #include static const int MOD = 1000000007; using ll = long long; using u32 = unsigned; using u64 = unsigned long long; using namespace std; template constexpr T INF = ::numeric_limits::max()/32*15+208; template T pow_ (T x, T n, int M){ uint64_t u = 1, xx = x; while (n > 0){ if (n&1) u = u * xx % M; xx = xx * xx % M; n >>= 1; } return static_cast(u); }; int main() { int n; cin >> n; vector v(n); for (auto &&i : v) scanf("%d", &i); for (int i = 0; i < n; ++i) { if(v[i] == 0){ cout << 0 << "\n"; return 0; } } vector r(n, n); for (int j = n-2; j >= 0; --j) { r[j] = r[j+1]; if(v[j+1] != 1) r[j] = j+1; } ll ans = 1; for (int i = 0; i < n; ++i) { ll val = 1; for (int j = i; j < n; j = r[j]) { val *= v[j]; if(val >= 1'000'000'000) break; ans *= pow_(val, ll(r[j]-j), MOD); ans %= MOD; } } cout << ans << "\n"; return 0; }