#include <bits/stdc++.h>
template <typename T>
void read(T& re) {
  re = 0;
  char ch = '!';
  while (ch < '0' || ch > '9') ch = getchar();
  while (ch >= '0' && ch <= '9') {
    re = re * 10 + ch - '0';
    ch = getchar();
  }
}
template <typename T, typename... Args>
void read(T& re, Args&... args) {
  read(re);
  read(args...);
}
template <typename T>
void write(T A) {
  if (A < 0) {
    A = -A;
    putchar('-');
  }
  if (A / 10) write(A / 10);
  putchar(A % 10 + '0');
}
const int MAXN = 5000 + 7, mod = 1e9 + 7;
int power(int A, int B) {
  int C = 1;
  while (B) {
    if (B & 1) C = C * (long long)A % mod;
    A = A * (long long)A % mod;
    B >>= 1;
  }
  return C;
}
int n;
int a[MAXN];
int down[MAXN][MAXN << 1], up[2][MAXN << 1], siz[MAXN];
int sum[MAXN << 1];
int main() {
  read(n);
  siz[1] = 1;
  for (int i = 1; i < n; i++) {
    read(a[i]);
    siz[i + 1] = siz[i] * (long long)a[i] % mod;
  }
  for (int i = n; i >= 1; i--) {
    down[i][0] = 1;
    for (int j = 1; j + i <= n; j++) {
      down[i][j] = down[i + 1][j - 1] * (long long)a[i] % mod;
      sum[j] = (sum[j] + siz[i] * (long long)down[i][j] % mod) % mod;
    }
  }
  up[0][0] = 1;
  for (int i = 2; i <= n; i++) {
    up[1][0] = 1;
    for (int j = 1; j <= i + n - 2; j++) {
      if (i > 1) up[1][j] = (up[1][j] + (long long)up[0][j - 1]) % mod;
      if (i > 1 && j >= 2)
        up[1][j] =
            ((up[1][j] + (long long)down[i - 1][j - 1] - down[i][j - 2]) % mod +
             mod) %
            mod;
      sum[j] = (sum[j] + siz[i] * (long long)up[1][j] % mod) % mod;
    }
    for (int j = 1; j <= i + n - 2; j++) {
      up[0][j] = up[1][j];
      up[1][j] = 0;
    }
  }
  for (int i = 1; i <= n + n - 2; i++) {
    write(sum[i] * (long long)((mod + 1) / 2) % mod);
    putchar(' ');
  }
}
