#include <bits/stdc++.h>
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
const long long int maxN = 5005;
long long int n;
vector<long long int> a, coords, keys;
long long int cnt[maxN];
long long int getKey(long long int x) {
  if (x == 0) return 0;
  vector<long long int> ans;
  if (x < 0) ans.push_back(-1);
  x = abs(x);
  for (long long int i = 2; i * i <= x; i++) {
    if (x % i == 0) {
      long long int cnt = 0;
      while (x % i == 0) {
        cnt++;
        x /= i;
      }
      if (cnt % 2 == 1) ans.push_back(i);
    }
  }
  if (x > 1) ans.push_back(x);
  long long int res = 1;
  for (auto i : ans) res *= i;
  return res;
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n;
  a.resize(n);
  keys.resize(n);
  for (long long int i = 0; i < n; i++) cin >> a[i];
  for (long long int i = 0; i < n; i++) {
    long long int key = getKey(a[i]);
    keys[i] = key;
    coords.push_back(key);
  }
  sort(coords.begin(), coords.end());
  coords.erase(unique(coords.begin(), coords.end()), coords.end());
  for (long long int i = 0; i < n; i++)
    keys[i] =
        (lower_bound(coords.begin(), coords.end(), keys[i]) - coords.begin());
  vector<long long int> ans(n + 1, 0);
  for (long long int i = 0; i < n; i++) {
    for (long long int j = 0; j < maxN; j++) cnt[j] = 0;
    long long int cntZ = 0, cntD = 0;
    for (long long int j = i; j < n; j++) {
      long long int key = keys[j];
      if (coords[key] == 0)
        cntZ++;
      else {
        cnt[key]++;
        if (cnt[key] == 1) cntD++;
      }
      if (cntD > 0)
        ans[cntD]++;
      else
        ans[cntZ > 0]++;
    }
  }
  for (long long int i = 1; i <= n; i++) cout << ans[i] << " ";
  return 0;
}
