import sys

sys.setrecursionlimit(2147483647)

INF=float("inf")

MOD=10**9+7

input=lambda :sys.stdin.readline().rstrip()

def resolve():

    from collections import Counter

    n=int(eval(input()))

    A=list(Counter(list(map(int,input().split()))).values())

    A.sort()

    m=len(A)

    S=[0]*(m+1) # cumulative distribution

    for i in range(m): S[i+1]=S[i]+A[i]

    # output

    p=n

    i=m

    from bisect import bisect_left

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

        while(1):

            # pに対して先にi_pを求めておく

            while(1):

                if(i<=0 or A[i-1]<p): break

                i-=1

            if(S[i]+p*(m-i)>=k*p): break # p<0 or を書く必要はない

            p-=1 # pの条件が真になるまで減らし続ける

        print(p)

resolve()
import sys

sys.setrecursionlimit(2147483647)

INF=float("inf")

MOD=10**9+7

input=lambda :sys.stdin.readline().rstrip()

def bin_sort(A,n_min=None,n_max=None):

    if(n_min is None): n_min=min(A)

    if(n_max is None): n_max=max(A)

    bin=[0]*(n_max-n_min+1)

    for a in A: bin[a-n_min]+=1

    B=[]

    for i in range(n_min,n_max+1): B+=[i]*bin[i-n_min]

    return B



def resolve():

    n=int(eval(input()))

    A=[0]*n

    for a in map(int,input().split()): A[a-1]+=1

    A=bin_sort(A,0,n)

    S=[0]*(n+1)

    for i in range(n): S[i+1]=S[i]+A[i]

    # output

    p=n; i=n

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

        while(1):

            while(1):

                if(i<=0 or A[i-1]<p): break

                i-=1

            if(S[i]+p*(n-i)>=k*p): break

            p-=1

        print(p)

resolve()
import sys

sys.setrecursionlimit(2147483647)
INF = float("inf")
MOD = 10**9 + 7
input = lambda: sys.stdin.readline().rstrip()


def resolve():
    from collections import Counter

    n = int(eval(input()))
    A = list(Counter(list(map(int, input().split()))).values())
    A.sort()
    m = len(A)
    S = [0] * (m + 1)  # cumulative distribution
    for i in range(m):
        S[i + 1] = S[i] + A[i]
    # output
    p = n
    i = m
    from bisect import bisect_left

    for k in range(1, n + 1):
        while 1:
            # pに対して先にi_pを求めておく
            while 1:
                if i <= 0 or A[i - 1] < p:
                    break
                i -= 1
            if S[i] + p * (m - i) >= k * p:
                break  # p<0 or を書く必要はない
            p -= 1  # pの条件が真になるまで減らし続ける
        print(p)


resolve()

import sys

sys.setrecursionlimit(2147483647)
INF = float("inf")
MOD = 10**9 + 7
input = lambda: sys.stdin.readline().rstrip()


def bin_sort(A, n_min=None, n_max=None):
    if n_min is None:
        n_min = min(A)
    if n_max is None:
        n_max = max(A)
    bin = [0] * (n_max - n_min + 1)
    for a in A:
        bin[a - n_min] += 1
    B = []
    for i in range(n_min, n_max + 1):
        B += [i] * bin[i - n_min]
    return B


def resolve():
    n = int(eval(input()))
    A = [0] * n
    for a in map(int, input().split()):
        A[a - 1] += 1
    A = bin_sort(A, 0, n)
    S = [0] * (n + 1)
    for i in range(n):
        S[i + 1] = S[i] + A[i]
    # output
    p = n
    i = n
    for k in range(1, n + 1):
        while 1:
            while 1:
                if i <= 0 or A[i - 1] < p:
                    break
                i -= 1
            if S[i] + p * (n - i) >= k * p:
                break
            p -= 1
        print(p)


resolve()

+def bin_sort(A, n_min=None, n_max=None): +    if n_min is None: +        n_min = min(A) +    if n_max is None: +        n_max = max(A) +    bin = [0] * (n_max - n_min + 1) +    for a in A: +        bin[a - n_min] += 1 +    B = [] +    for i in range(n_min, n_max + 1): +        B += [i] * bin[i - n_min] +    return B + + -    from collections import Counter - -    A = list(Counter(list(map(int, input().split()))).values()) -    A.sort() -    m = len(A) -    S = [0] * (m + 1)  # cumulative distribution -    for i in range(m): +    A = [0] * n +    for a in map(int, input().split()): +        A[a - 1] += 1 +    A = bin_sort(A, 0, n) +    S = [0] * (n + 1) +    for i in range(n): -    i = m -    from bisect import bisect_left - +    i = n -            # pに対して先にi_pを求めておく -            if S[i] + p * (m - i) >= k * p: -                break  # p<0 or を書く必要はない -            p -= 1  # pの条件が真になるまで減らし続ける +            if S[i] + p * (n - i) >= k * p: +                break +            p -= 1