#include <bits/stdc++.h>
using namespace std;
const int MAX = 5e3 + 7;
int num[MAX];
int N;
int getn(int x) {
  int bj = 0;
  if (x < 0) {
    bj = 1;
    x = -x;
  }
  for (int i = 2; i * i <= x; i++) {
    while (x % (i * i) == 0) {
      x /= (i * i);
    }
  }
  return bj ? -x : x;
}
void uni() {
  int tmp[MAX];
  memcpy(tmp, num, sizeof(num));
  sort(tmp + 1, tmp + 1 + N);
  for (int i = 1; i <= N; i++) {
    num[i] = lower_bound(tmp + 1, tmp + 1 + N, num[i]) - tmp - 1;
  }
}
int sum;
int cnt[MAX];
int tmp[MAX];
void add(int p) {
  if (!cnt[tmp[p]]) {
    sum++;
  }
  cnt[tmp[p]]++;
}
int apr[MAX];
int tot = 0;
map<int, int> m;
int main() {
  ios::sync_with_stdio(0);
  cin >> N;
  for (int i = 1; i <= N; i++) {
    cin >> num[i];
    num[i] = getn(num[i]);
    if (!m[num[i]]) {
      m[num[i]] = ++tot;
      tmp[i] = tot;
    } else
      tmp[i] = m[num[i]];
  }
  for (int i = 1; i <= N; i++) {
    memset(cnt, 0, sizeof(cnt));
    sum = 0;
    for (int j = i; j <= N; j++) {
      if (!num[j]) {
        if (!sum)
          apr[1]++;
        else
          apr[sum]++;
      } else {
        add(j);
        apr[sum]++;
      }
    }
  }
  for (int i = 1; i <= N; i++) {
    cout << apr[i] << ' ';
  }
}
