#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 << ' ';
  }
}
