func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 5010;   int n, arr[N], ans[(N << 1)];   vector<int> a[N], b[N];   const int inv2 = 500000004;   int main() {     scanf( %d , &n);     for (int i = 0; i < n; i++) {       scanf( %d , &arr[i]);     }     for (int i = n - 2; i >= 0; i--) {       a[i].resize((int)a[i + 1].size() + 1);       for (int j = 1; j < (int)a[i].size(); j++) {         a[i][j] = (long long)a[i + 1][j - 1] * arr[i] % 1000000007;       }       a[i][0] = arr[i];     }     b[0] = a[0];     for (int i = 0; i < (int)b[0].size(); i++) ans[i] = b[0][i];     int cur = arr[0];     for (int i = 1; i < n; i++) {       swap(b[i], b[i - 1]);       b[i][0]--;       if (b[i][0] < 0) b[i][0] += 1000000007;       for (int j = 0; j < (int)a[i].size(); j++) {         b[i][j + 1] -= a[i][j];         if (b[i][j + 1] < 0) b[i][j + 1] += 1000000007;       }       b[i].push_back(0);       for (int j = (int)b[i].size() - 1; j >= 0; j--) {         b[i][j] = b[i][j - 1];       }       b[i][0] = 1;       for (int j = 0; j < (int)a[i].size(); j++) {         b[i][j] += a[i][j];         if (b[i][j] >= 1000000007) b[i][j] -= 1000000007;       }       for (int j = 0; j < (int)b[i].size(); j++) {         ans[j] += (long long)b[i][j] * cur % 1000000007;         if (ans[j] >= 1000000007) ans[j] -= 1000000007;       }       cur = (long long)cur * arr[i] % 1000000007;     }     for (int i = 1; i <= 2 * n - 2; i++) {       if (i > 1) putchar(   );       printf( %d , (long long)ans[i - 1] * inv2 % 1000000007);     }     puts(  );     return 0;   }   