#!/usr/bin/env python3



import sys

import math

from bisect import bisect_right as br

from bisect import bisect_left as bl

sys.setrecursionlimit(2147483647)

from heapq import heappush, heappop,heappushpop

from collections import defaultdict

from itertools import accumulate

from collections import Counter

from collections import deque

from operator import itemgetter

from itertools import permutations

mod = 10**9 + 7

inf = float('inf')

def I(): return int(sys.stdin.readline())

def LI(): return list(map(int,sys.stdin.readline().split()))

"""

.2分探索を考える

.各kに対してx回以上抜き出せるかという問いを考える

.各数の個数を数えて数iの個数をCiとする

.各数iを抜き出せるのはCiまで

 ⇒各数を抜き出す回数min(Ci,x)

.Σmin(Ci,x)はkx以上でなければいけない(k個x回抜き出すため)

.これを満たすときx回抜き出せる

.このままではO(n^2(logn))なので工夫する

.Σ(min(Ci,x))はk依存でないのでここを工夫する(Σ(min(Ci,x))をSxとする)

.SxはSx-1と比べてx以上のCiの数だけ増える(x以上のCiの数をDxとする)

.Sx := Sx-1 + Dx

.Dxを求める時はCのリストについてbisectを行う。

.Sx >= k*xとなるxの最大値を2分探索で求める。(O(nlogn))

"""

n = I()

a = LI()

cnt = list(Counter(a).values())

cnt.sort()

m = len(cnt)

S = [0]*(n+1)

for x in range(1,n+1):

    l = bl(cnt,x)

    S[x] = S[x-1] + (m-l)

for k in range(1,n+1):

    high,low = n+1,0

    while high - low > 1:

        mid = (high + low)//2

        if S[mid] >= k*mid:

            low = mid

        else:

            high = mid

    print(low)

#!/usr/bin/env python3



import sys

import math

from bisect import bisect_right as br

from bisect import bisect_left as bl

sys.setrecursionlimit(2147483647)

from heapq import heappush, heappop,heappushpop

from collections import defaultdict

from itertools import accumulate

from collections import Counter

from collections import deque

from operator import itemgetter

from itertools import permutations

mod = 10**9 + 7

inf = float('inf')

def I(): return int(sys.stdin.readline())

def LI(): return list(map(int,sys.stdin.readline().split()))

"""

.2分探索を考える

.各kに対してx回以上抜き出せるかという問いを考える

.各数の個数を数えて数iの個数をCiとする

.各数iを抜き出せるのはCiまで

 ⇒各数を抜き出す回数min(Ci,x)

.Σmin(Ci,x)はkx以上でなければいけない(k個x回抜き出すため)

.これを満たすときx回抜き出せる

.このままではO(n^2(logn))なので工夫する

.Σ(min(Ci,x))はk依存でないのでここを工夫する(Σ(min(Ci,x))をSxとする)

.SxはSx-1と比べてx以上のCiの数だけ増える(x以上のCiの数をDxとする)

.Sx := Sx-1 + Dx

.Dxを求める時はCのリストについてbisectを行う。

⇒Ciの個数のリストdを用意してdの累積和を用意しておくとO(n)

.Sx >= k*xとなるxの最大値を2分探索で求める。(O(nlogn))

⇒変形すると,Sx/x >= kであり、各kに対してSx/xは単調減少なのでO(n)

"""

n = I()

a = LI()

cnt = list(Counter(a).values())

d = [0]*(n+1)

for i in cnt:

    d[i] += 1

d = list(accumulate(d))

m = d[-1]

S = [0]*(n+1)

for i in range(1,n+1):

    S[i] = S[i-1] + (m - d[i-1]) 

S2 = [0]*(n+1)

for i in range(1,n+1):

    S2[i] = S[i]//i

tmp = n

for k in range(1,n+1):

    while S2[tmp] < k:

        tmp -= 1

        if tmp <= 0:

            print((0))

            break

    else:

        print(tmp)

#!/usr/bin/env python3
import sys
import math
from bisect import bisect_right as br
from bisect import bisect_left as bl

sys.setrecursionlimit(2147483647)
from heapq import heappush, heappop, heappushpop
from collections import defaultdict
from itertools import accumulate
from collections import Counter
from collections import deque
from operator import itemgetter
from itertools import permutations

mod = 10**9 + 7
inf = float("inf")


def I():
    return int(sys.stdin.readline())


def LI():
    return list(map(int, sys.stdin.readline().split()))


"""
.2分探索を考える
.各kに対してx回以上抜き出せるかという問いを考える
.各数の個数を数えて数iの個数をCiとする
.各数iを抜き出せるのはCiまで
 ⇒各数を抜き出す回数min(Ci,x)
.Σmin(Ci,x)はkx以上でなければいけない(k個x回抜き出すため)
.これを満たすときx回抜き出せる
.このままではO(n^2(logn))なので工夫する
.Σ(min(Ci,x))はk依存でないのでここを工夫する(Σ(min(Ci,x))をSxとする)
.SxはSx-1と比べてx以上のCiの数だけ増える(x以上のCiの数をDxとする)
.Sx := Sx-1 + Dx
.Dxを求める時はCのリストについてbisectを行う。
.Sx >= k*xとなるxの最大値を2分探索で求める。(O(nlogn))
"""
n = I()
a = LI()
cnt = list(Counter(a).values())
cnt.sort()
m = len(cnt)
S = [0] * (n + 1)
for x in range(1, n + 1):
    l = bl(cnt, x)
    S[x] = S[x - 1] + (m - l)
for k in range(1, n + 1):
    high, low = n + 1, 0
    while high - low > 1:
        mid = (high + low) // 2
        if S[mid] >= k * mid:
            low = mid
        else:
            high = mid
    print(low)

#!/usr/bin/env python3
import sys
import math
from bisect import bisect_right as br
from bisect import bisect_left as bl

sys.setrecursionlimit(2147483647)
from heapq import heappush, heappop, heappushpop
from collections import defaultdict
from itertools import accumulate
from collections import Counter
from collections import deque
from operator import itemgetter
from itertools import permutations

mod = 10**9 + 7
inf = float("inf")


def I():
    return int(sys.stdin.readline())


def LI():
    return list(map(int, sys.stdin.readline().split()))


"""
.2分探索を考える
.各kに対してx回以上抜き出せるかという問いを考える
.各数の個数を数えて数iの個数をCiとする
.各数iを抜き出せるのはCiまで
 ⇒各数を抜き出す回数min(Ci,x)
.Σmin(Ci,x)はkx以上でなければいけない(k個x回抜き出すため)
.これを満たすときx回抜き出せる
.このままではO(n^2(logn))なので工夫する
.Σ(min(Ci,x))はk依存でないのでここを工夫する(Σ(min(Ci,x))をSxとする)
.SxはSx-1と比べてx以上のCiの数だけ増える(x以上のCiの数をDxとする)
.Sx := Sx-1 + Dx
.Dxを求める時はCのリストについてbisectを行う。
⇒Ciの個数のリストdを用意してdの累積和を用意しておくとO(n)
.Sx >= k*xとなるxの最大値を2分探索で求める。(O(nlogn))
⇒変形すると,Sx/x >= kであり、各kに対してSx/xは単調減少なのでO(n)
"""
n = I()
a = LI()
cnt = list(Counter(a).values())
d = [0] * (n + 1)
for i in cnt:
    d[i] += 1
d = list(accumulate(d))
m = d[-1]
S = [0] * (n + 1)
for i in range(1, n + 1):
    S[i] = S[i - 1] + (m - d[i - 1])
S2 = [0] * (n + 1)
for i in range(1, n + 1):
    S2[i] = S[i] // i
tmp = n
for k in range(1, n + 1):
    while S2[tmp] < k:
        tmp -= 1
        if tmp <= 0:
            print((0))
            break
    else:
        print(tmp)

+⇒Ciの個数のリストdを用意してdの累積和を用意しておくとO(n) +⇒変形すると,Sx/x >= kであり、各kに対してSx/xは単調減少なのでO(n) -cnt.sort() -m = len(cnt) +d = [0] * (n + 1) +for i in cnt: +    d[i] += 1 +d = list(accumulate(d)) +m = d[-1] -for x in range(1, n + 1): -    l = bl(cnt, x) -    S[x] = S[x - 1] + (m - l) +for i in range(1, n + 1): +    S[i] = S[i - 1] + (m - d[i - 1]) +S2 = [0] * (n + 1) +for i in range(1, n + 1): +    S2[i] = S[i] // i +tmp = n -    high, low = n + 1, 0 -    while high - low > 1: -        mid = (high + low) // 2 -        if S[mid] >= k * mid: -            low = mid -        else: -            high = mid -    print(low) +    while S2[tmp] < k: +        tmp -= 1 +        if tmp <= 0: +            print((0)) +            break +    else: +        print(tmp)