#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<b;i++)
int mod = 1000000007;
int add(int x, int y) { return (x += y) >= mod ? x - mod : x; }
template<class... T> int add(int x, T... y) { return add(x, add(y...)); }
int mul(int x, int y) { return 1LL * x * y % mod; }
template<class... T> int mul(int x, T... y) { return mul(x, mul(y...)); }
int sub(int x, int y) { return add(x, mod - y); }
int modpow(int a, long long b) {
int ret = 1;
while (b > 0) {
if (b & 1) ret = 1LL * ret * a % mod;
a = 1LL * a * a % mod; b >>= 1;
}
return ret;
}
int modinv(int a) { return modpow(a, mod - 2); }
//-----------------------------------------------------------------
int N, A[101010];
int mu[101010];
void pre() {
mu[0] = 1;
rep(i, 1, N + 1) mu[i] = mul(mu[i - 1], A[i]);
}
int pat(int L, int R) {
return mul(mu[R], modinv(mu[L - 1]), modpow(2, max(0, L - 2) + max(0, N - R - 1)));
}
//-----------------------------------------------------------------
int dp[101010];
int main() {
cin >> N;
rep(i, 1, N + 1) scanf("%d", &A[i]);
pre();
/* Naive ********************************
int ans = 0;
rep(L, 1, N + 1) rep(R, L, N + 1) ans = add(ans, pat(L, R));
cout << ans << endl;
*/
dp[1] = 0;
rep(R, 1, N + 1) dp[1] = add(dp[1], pat(1, R));
rep(i, 1, N) { // dp[i]からdp[i + 1]を計算する
dp[i + 1] = sub(dp[i], pat(i,i));
dp[i + 1] = mul(dp[i + 1], modinv(A[i]));
if (i != 1) dp[i + 1] = mul(dp[i + 1], 2);
}
int ans = 0;
rep(i, 1, N + 1) ans = add(ans, dp[i]);
cout << ans << endl;
}
./Main.cpp: In function ‘int main()’:
./Main.cpp:36:37: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
rep(i, 1, N + 1) scanf("%d", &A[i]);
^