//dp[i][j]表示做前i道题做对j道
//考虑状态转移方程,如果前i-1道题做对j道,那么第i道题肯定是做错了,如果前i-1道题做对了j-1道题,那么第i道题肯定是做对了(这样就可以得出状态转移方程)
/*状态转移方程为:
dp[i][j]=
dp[i-1][j]*(1-p[i]+mod)%mod ------第i道题做错了的情况
+
dp[i-1][j-1]*p[i]%mod ------第i道题做对了的情况
*/
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <sstream>
#include <map>
#include <set>
#include <queue>
#include <stdlib.h>
typedef long long ll;
using namespace std;
const int maxn=2020;
const int mod=1e9+7;
#define ll long long
ll p[maxn];
ll dp[maxn][maxn];
int main()
{
int n; //一共有n道题
cin >> n;
for(int i=1;i<=n;i++) //每一道题正确的概率
{
cin >> p[i];
}
dp[0][0]=1; //前0道题正确0道的概率是百分之百
for(int i=1;i<=n;i++)
{
//因为前i道题做对0道的j不能减为0,所以要单独写出来
dp[i][0]=dp[i-1][0]*(mod+1-p[i])%mod; //前i道题做对0道的概率是前i-1道题做对0道的概率*当前这道题没有做对的概率
for(int j=1;j<=i;j++)
{
dp[i][j]= (dp[i-1][j]*(mod+1-p[i])%mod + dp[i-1][j-1]*(p[i]))%mod;
}
}
for(int i=0;i<=n;i++)
{
cout << dp[n][i];
if(i!=n) cout << " ";
}
cout << endl;
return 0;
}