func_code_string: #include <bits/stdc++.h>   using namespace std;   template <typename T>   inline void Read(T &x) {     x = 0;     char c;     while (!isdigit(c = getchar()))       ;     do {       x = x * 10 + c -  0 ;     } while (isdigit(c = getchar()));   }   long long read() {     long long tmp;     cin >> tmp;     return tmp;   }   void giuncute() {     ios_base::sync_with_stdio(0);     cin.tie(0);     cout.tie(0);   }   void OF() {     freopen(          f           .inp ,          r , stdin);     freopen(          f           .out ,          w , stdout);   }   const long long MOD = 1e9 + 7, mxn = 5e3 + 2;   long long n, a[mxn] = {0}, numNode[mxn] = {0}, p[mxn];   int down[mxn][mxn] = {{0}}, up[mxn][2] = {{0}};   long long Pow(long long u, long long v) {     if (!v) return 1;     long long tmp = Pow(u, v >> 1);     (tmp *= tmp) %= MOD;     if (v & 1) return (tmp * u) % MOD;     return tmp;   }   int main() {     giuncute();     cin >> n;     numNode[1] = 1;     for (long long i = 1; i <= n - 1; ++i) {       cin >> a[i];       numNode[i + 1] = (numNode[i] * a[i]) % MOD;       p[i] = Pow(a[i], MOD - 2);     }     for (long long i = 1; i <= n; ++i) down[i][1] = a[i], up[i][1] = 1;     up[1][1] = 0;     for (long long i = n - 1; i >= 1; --i)       for (long long j = 2; j <= n - i; ++j)         down[i][j] = (a[i] * down[i + 1][j - 1]) % MOD;     long long p2 = Pow(2, MOD - 2);     for (long long j = 1; j <= n * 2 - 2; ++j) {       long long cnt_up = 0, cnt_down = 0;       if (j != 1)         for (long long i = 2; i <= n; ++i) {           if (j > n + i - 2) continue;           (up[i][j & 1] += up[i - 1][~j & 1]) %= MOD;           if (j <= n && down[i - 1][j - 1])             (up[i][j & 1] +=              (down[i - 1][j - 1] * (((a[i - 1] - 1) * p[i - 1]) % MOD)) % MOD) %=                 MOD;         }       for (long long i = 1; i <= n; ++i) {         up[i][~j & 1] = 0;         if (j > n + i - 2) continue;         (cnt_up += (numNode[i] * up[i][j & 1]) % MOD) %= MOD;         if (j < n) (cnt_down += (numNode[i] * down[i][j]) % MOD) %= MOD;       }       cout << (((cnt_up + cnt_down) % MOD) * p2) % MOD <<    ;     }   }   