Problem:
Score : 600 points

Problem Statement

Takahashi has N cards. The i-th of these cards has an integer A_i written on it.

Takahashi will choose an integer K, and then repeat the following operation some number of times:

Choose exactly K cards such that the integers written on them are all different, and eat those cards. (The eaten cards disappear.)

For each K = 1,2, \ldots, N, find the maximum number of times Takahashi can do the operation.

Constraints

1 \le N \le 3 \times 10^5

1 \le A_i \le N

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
A_1 A_2 \ldots A_N

Output

Print N integers.
The t-th (1 \le t \le N) of them should be the answer for the case K=t.

Sample Input 1

3
2 1 2

Sample Output 1

3
1
0

For K = 1, we can do the operation as follows:

Choose the first card to eat.

Choose the second card to eat.

Choose the third card to eat.

For K = 2, we can do the operation as follows:

Choose the first and second cards to eat.

For K = 3, we cannot do the operation at all. Note that we cannot choose the first and third cards at the same time.

Sample Input 2

5
1 2 3 4 5

Sample Output 2

5
2
1
1
1

Sample Input 3

4
1 3 3 3

Sample Output 3

4
1
0
0

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)


#include <iostream>
#include <math.h>
#include <algorithm>
#include <functional> 
#include <string>
#include <vector>

#include <cstring>
#include <set>
#include <map>
#include <queue>
#include <utility>

using namespace std;

typedef long long LL;

#define dump(c) { for (auto it = c.begin(); it != c.end(); ++it) if (it == c.begin()) cout << *it; else cout << ' ' << *it; cout << endl; } 
#define rep(i,n) for (int i = 0; i < (n); ++i)


bool check(const vector<int>& h, int k, int x) {
    int sum = 0;
    for (int count: h) {
        sum += min(x, count);
    }
    return (x * k <= sum); 
} 


int solve(const vector<int>& h, int k) 
{
    int minX = 0;
    int maxX = (h[0] * h.size()) / k;

    while (minX < maxX) {
        int x = (minX + maxX + 1) / 2;
        if (check(h, k, x)) {
            // cout << k << ", " << x << " => OK" << endl;
            minX = x;
        } else {
            // cout << k << ", " << x << " => NG" << endl;
            maxX = x-1;
        }
    }

    return minX;
}

int main()
{
    int N;
    cin >> N;
    vector<int> hist(N);
    rep(i, N) {
        int a;
        cin >> a;
        ++hist[a-1];
    }

    sort(hist.begin(), hist.end());

    vector<int> s(N+1);  //! s[i] = sum of hist[0..i) 
    for (int i = 1; i <= N; ++i) {
        s[i] = s[i-1] + hist[i-1];
    }

    int ans = N;
    for (int k = 1; k <= N; ++k) {
        auto check = [&](int c) {
            int i = lower_bound(hist.begin(), hist.end(), c) - hist.begin();
            LL sum = c * (N-i) + s[i];
            bool ret = (c * k <= sum);
            // cout << "check is called with c = " << c << ", k = " << k << ", i = " << i << " => " << (ret ? "true" : "false") << endl;
            return ret;
        };
        while (0 <= ans) {
            if (check(ans)) {
                break;
            } else {
                --ans;
            }
        }
        cout << ans << '\n';
    }
    cout << endl;

    return 0;
}