import std.array;
import std.stdio;
import std.algorithm;
import std.string;
import std.conv;
import std.container;

int[int] counts, freq;
int maxFreq;

void solve(size_t k) {
    auto f = freq.dup;
    int ret = 0;
    while (true) {
        debug writeln("k:", k, "freq:", f);
        int n = 0;
        int[int] diff;
        foreach_reverse (v; 1 .. maxFreq + 1) {
            if (n == k) break;

            auto m = min(k - n, f[v]);
            n += m;
            f[v] -= m;
            debug writeln("add: ", m);
            if (v > 1) diff[v - 1] = m;
        }
        foreach (k, v; diff) {
            f[k] += v;
        }
        if (n != k) break;
        ++ret;
    }
    writeln(ret);
}

void main() {
    int n;
    readf("%d\n", &n);
    foreach (a; readln().split.map!(to!int)) {
        counts[a] = counts.get(a, 0) + 1;
    }
    foreach (k, v; counts) {
        freq[v] = freq.get(v, 0) + 1;
        maxFreq = max(maxFreq, v);
    }
    debug writeln(counts, freq);
    foreach (k; 1 .. n + 1) {
        solve(k);
    }
}
