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: Runtime Error)

#include <iostream>
#include <string>
#include <algorithm>
#include <cmath>
#include <functional>
#include <vector>
#include <queue>
#include <deque>
#include <map>
#include <set>
#define nmax_def 330000
#define Cmax_def 2200
#define mod 1000000007
#define rep(i,n) for(int (i)=0;(i)<(n);(i)++)
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;

int main() {
	int N;
	cin >> N;
	vi A(N);
	vi atmp(nmax_def);
	rep(i, N) {
		cin >> A[i];
		atmp[A[i]]++;
	}
	sort(atmp.begin(), atmp.end(), greater<int>());
	vi a;
	rep(i, nmax_def) {
		if (atmp[i] == 0)
			continue;
		a.push_back(atmp[i]);
	}
	int M = a.size();
	vi ans(N + 1);
	for (int i = N; i > 0; i--) {
		if (M < i) {
			ans[i] = 0;
			continue;
		}
		ans[i] = a[i - 1];
		int p = i - 2;
		rep(j, a[i - 1]) {
			if (p < 0)
				p = i - 2;
			a[p]++;
			if (p > 0) {
				if (a[p - 1] <= a[p]) {
					p = i - 2;
				}
			}
			p--;
		}
	}
	rep(i, N) {
		cout << ans[i + 1] << endl;
	}
	return 0;
}