func_code_string: #include <bits/stdc++.h>   using namespace std;   const int mod = 1e9 + 7;   const int N = 10010;   int f[2][N], g[2][N], a[N], ans[N], b[N], pr[N];   inline int qpow(long long a, int b, const int p) {     int ret = 1;     a %= p;     while (b) {       ret = ret * 1ll * (b & 1 ? a : 1) % p;       a = a * a % p, b >>= 1;     }     return ret;   }   int main() {     auto _add = [&](int &x, int y) {       x += y;       if (x >= mod) x -= mod;     };     int n;     scanf( %d , &n);     a[1] = 1;     b[1] = 1;     const int inv_2 = mod - mod / 2;     for (int i = 2; i <= n; i++) scanf( %d , &a[i]), b[i] = a[i];     for (int i = 2; i <= n; i++) b[i] = b[i - 1] * 1ll * b[i] % mod;     for (int i = n; i >= 2; i--) pr[i] = (pr[i + 1] + b[i]) % mod;     for (int i = 1; i <= n; i++) {       f[i & 1][0] = g[i & 1][0] = 1;       for (int j = 1; j <= n * 2 - 2; j++) {         f[i & 1][j] = f[i & 1][j - 1] * 1ll * a[i + j] % mod;         g[i & 1][j] = 0;         if (j >= 2)           _add(g[i & 1][j], f[i & 1][j - 2] * 1ll * (a[i] - 1 + mod) % mod);         _add(g[i & 1][j], g[(i - 1) & 1][j - 1]);         _add(ans[j], g[i & 1][j] * 1ll * b[i] % mod);       }     }     for (int i = 1; i <= 2 * n - 2; i++) {       if (i <= n - 1) {         ans[i] =             ((ans[i] - pr[1 + i] + mod) % mod * 1ll * inv_2 % mod + pr[1 + i]) %             mod;       } else         ans[i] = ans[i] * 1ll * inv_2 % mod;     }     for (int i = 1; i <= 2 * n - 2; i++)       printf( %d%c , ans[i], i == 2 * n - 2 ?   n  :    );     return 0;   }   