#include <bits/stdc++.h>
using namespace std;
using lli = long long int;
using vb = vector<bool>;
using vc = vector<char>;
using vd = vector<double>;
using vi = vector<int>;
using vvi = vector<vi>;
using vlli = vector<lli>;
using vvlli = vector<vlli>;
using pi = pair<int, int>;
using plli = pair<lli, lli>;
int readint() {
  int q;
  scanf("%d", &q);
  return q;
}
lli readlong() {
  lli q;
  scanf("%lld", &q);
  return q;
}
double readdbl() {
  double q;
  scanf("%lf", &q);
  return q;
}
char readc() {
  char q;
  scanf("%c", &q);
  return q;
}
void printint(int q) { printf("%d", q); }
void printlong(lli q) { printf("%lld", q); }
void printdbl(double q, int p = 6) { printf("%.*lf", p, q); }
void readln() { scanf("\n"); }
void println() { printf("\n"); }
void space() { printf(" "); }
void print(int q) { printint(q); }
void print(lli q) { printlong(q); }
void print(double q) { printdbl(q); }
void print(char c) { printf("%c", c); }
template <typename T>
void println(T q) {
  print(q);
  println();
}
template <typename T>
void printsp(T q) {
  print(q);
  space();
}
template <typename T>
T maxim(T f, T s) {
  return (f > s) ? f : s;
}
template <typename T>
T minim(T f, T s) {
  return (f < s) ? f : s;
}
template <typename T>
T abs(T arg) {
  return arg < 0 ? -arg : arg;
}
const lli modulo = 998244353;
int dp[82][82][3200];
int main() {
  int n = readint();
  vi b(n);
  vi a;
  int cnt = 0;
  int zeroes = 0;
  for (int i = 0; i < n; ++i) {
    b[i] = readint();
    zeroes += (1 - b[i]);
    if (b[i] == 1) {
      a.push_back(cnt);
      cnt = 0;
    } else
      cnt++;
  }
  a.push_back(cnt);
  int nn = n;
  n = int(a.size());
  vi prefsum(n + 1, 0);
  for (int i = 0; i < n; ++i) prefsum[i + 1] = prefsum[i] + a[i];
  for (int i = 0; i < n + 1; ++i)
    for (int j = 0; j < 82; ++j)
      for (lli k = 0; k < 3200; ++k) dp[i][j][k] = 1e9;
  dp[0][0][0] = 0;
  int sum = 0;
  for (int i = 0; i < n; ++i) {
    sum += a[i];
    dp[i + 1][sum][0] = dp[i][sum - a[i]][0] + a[i] * a[i];
  }
  for (lli k = 0; k < nn * (nn - 1) / 2 + 1; ++k) {
    for (int i = 0; i < n; ++i) {
      for (int j = 0; j < 82; ++j)
        if (dp[i][j][k] != 1e9) {
          dp[i][j][k + 1] = minim(dp[i][j][k + 1], dp[i][j][k]);
          for (int next = 0; j + next <= zeroes; ++next) {
            int newk = k + abs(j + next - prefsum[i + 1]);
            if (newk <= nn * (nn - 1) / 2)
              dp[i + 1][j + next][newk] =
                  minim(dp[i + 1][j + next][newk], dp[i][j][k] + next * next);
          }
        }
    }
  }
  for (lli k = 0; k < nn * (nn - 1) / 2 + 1; ++k) {
    printsp(zeroes * (zeroes - 1) / 2 - (dp[n][zeroes][k] - zeroes) / 2);
  }
  return 0;
}
