Buggy python submission (verdict: Time Limit Exceeded):
#numpyで数えていたのを変更
N=int(input())
A=list(map(int,input().split()))

c = [0] * (N + 1)
Dx = [0] * (N + 1)
for a in A:
    c[a] += 1
    Dx[c[a]] += 1

Sx=[0]#初項は0
for j in range(1,N+1):
    Sx.append(Sx[j-1]+Dx[j])

#Sxが作れたので、xに関して二分探索をする
for k in range(1,N+1):
    x_min=0
    x_max=N+1
    while x_max>x_min+1:
        x_mid=(x_max+x_min)//2
        if Sx[x_mid]>=k*x_mid:
            x_min=x_mid
        else:
            x_max=x_mid
    print(x_min)

Fixed submission:
N=int(input())
A=list(map(int,input().split()))

c = [0] * (N + 1)
Dx = [0] * (N + 1)
for a in A:
    c[a] += 1 #cは、aという数が出た回数を記録
    Dx[c[a]]+=1
    #Dxは、その回数のところに種類を記録。賢い。

Sx=[0]#初項は0
for j in range(1,N+1):
    Sx.append(Sx[j-1]+Dx[j])
#解法2を真似してみる。
for h in range(1,N+1):
    Sx[h]=Sx[h]/h

x=N
k=1
while k<N+1:
    if x<0:
        for _ in range(N-k+1):
            print(0)
        exit(0)
    if k<=Sx[x]:
        print(x)
        k+=1
    else:
        x-=1

Buggy python submission (verdict: Time Limit Exceeded):
#numpyで数えていたのを変更
N=int(input())
A=list(map(int,input().split()))
from collections import Counter
c=Counter(A)
c_all_ones=Counter()
for key in c.keys():
    c_all_ones[key]=1
Dx=[0]
for i in range(1,N+1):
    Dx.append(len(c))
    c.subtract(c_all_ones)
    c=+c #0以下を削除

Sx=[0]#初項は0
for j in range(1,N+1):
    Sx.append(Sx[j-1]+Dx[j])

#Sxが作れたので、xに関して二分探索をする
for k in range(1,N+1):
    x_min=0
    x_max=N+1
    while x_max>x_min+1:
        x_mid=(x_max+x_min)//2
        if Sx[x_mid]>=k*x_mid:
            x_min=x_mid
        else:
            x_max=x_mid
    print(x_min)

Fixed submission:
N=int(input())
A=list(map(int,input().split()))

c = [0] * (N + 1)
Dx = [0] * (N + 1)
for a in A:
    c[a] += 1 #cは、aという数が出た回数を記録
    Dx[c[a]]+=1
    #Dxは、その回数のところに種類を記録。賢い。

Sx=[0]#初項は0
for j in range(1,N+1):
    Sx.append(Sx[j-1]+Dx[j])
#解法2を真似してみる。
for h in range(1,N+1):
    Sx[h]=Sx[h]/h

x=N
k=1
while k<N+1:
    if x<0:
        for _ in range(N-k+1):
            print(0)
        exit(0)
    if k<=Sx[x]:
        print(x)
        k+=1
    else:
        x-=1

Buggy python submission (verdict: Time Limit Exceeded):
N=int(input())
A=list(map(int,input().split()))
from collections import Counter
import numpy as np
c=Counter(A)
c_np=np.array(c.most_common())#リストにいったん変換しないと。
#Sx=Σmin(ci,x)を求める
#SxもDxもNまで作れば十分
Dx=[0] #D_0は使わない。インデックスの調整用
for i in range(1,N+1):
    target=c_np[c_np[:,1]>=i]
    Dx.append( len(target) )
#i以上の部分の個数はこれで決まり
Sx=[0]#初項は0
for j in range(1,N+1):
    Sx.append(Sx[j-1]+Dx[j])

#Sxが作れたので、xに関して二分探索をする
for k in range(1,N+1):
    x_min=0
    x_max=N+1
    while x_max>x_min+1:
        x_mid=(x_max+x_min)//2
        if Sx[x_mid]>=k*x_mid:
            x_min=x_mid
        else:
            x_max=x_mid
    print(x_min)

Fixed submission:
N=int(input())
A=list(map(int,input().split()))

c = [0] * (N + 1)
Dx = [0] * (N + 1)
for a in A:
    c[a] += 1 #cは、aという数が出た回数を記録
    Dx[c[a]]+=1
    #Dxは、その回数のところに種類を記録。賢い。

Sx=[0]#初項は0
for j in range(1,N+1):
    Sx.append(Sx[j-1]+Dx[j])
#解法2を真似してみる。
for h in range(1,N+1):
    Sx[h]=Sx[h]/h

x=N
k=1
while k<N+1:
    if x<0:
        for _ in range(N-k+1):
            print(0)
        exit(0)
    if k<=Sx[x]:
        print(x)
        k+=1
    else:
        x-=1

Buggy python submission (verdict: Time Limit Exceeded):
N=int(input())
A=list(map(int,input().split()))
from collections import Counter
for k in range(1,N+1):
    c=Counter(A)
    ans=0
    if len(c)<k:
        print(0)
    else:
        while True:
            for (i,j) in c.most_common()[:k]:
                c[i]-=1
            if c.most_common()[-1][1]<0:
                break
            ans+=1
        print(ans)


Fixed submission:
N=int(input())
A=list(map(int,input().split()))

c = [0] * (N + 1)
Dx = [0] * (N + 1)
for a in A:
    c[a] += 1 #cは、aという数が出た回数を記録
    Dx[c[a]]+=1
    #Dxは、その回数のところに種類を記録。賢い。

Sx=[0]#初項は0
for j in range(1,N+1):
    Sx.append(Sx[j-1]+Dx[j])
#解法2を真似してみる。
for h in range(1,N+1):
    Sx[h]=Sx[h]/h

x=N
k=1
while k<N+1:
    if x<0:
        for _ in range(N-k+1):
            print(0)
        exit(0)
    if k<=Sx[x]:
        print(x)
        k+=1
    else:
        x-=1