#include #include #include #define FOR(i, s, n) for(auto i = (s); i < n; ++i) #define REP(i, n) FOR(i, decltype(n)(), n) using ll = long long; constexpr ll mod = 1000000007; template class pow_preproc { using array_t = std::array::digits>; static constexpr array_t get_dp() { array_t dp = {b % mod}; FOR(i, 1, std::numeric_limits::digits) { dp[i] = (dp[i - 1] * dp[i - 1]) % mod; } return dp; } static constexpr array_t _dp = get_dp(); public: static constexpr T get_pow(T x) { if(x < 0) return 0; T y = 1; for(int i = 0; x; ++i) { if(x % 2) { y *= _dp[i]; y %= mod; } x /= 2; } return y; } }; std::array a = {}; using pow3 = pow_preproc; int main() { int n; ll sum = 0; ll muls = 1; std::cin >> n; REP(i, n) { ll a; std::cin >> a; muls *= a; muls %= mod; ll p = pow3::get_pow(n - i - 2); if(p <= 0) p = 1; else { p *= 2; p %= mod; } sum += muls * p; if(sum > mod) sum -= mod; } std::cout << sum << '\n'; }