// Original C++ solution (slower):
#include<bits/stdc++.h>

using namespace std;

#define F first

#define S second

#define ignore ignore

#define pb emplace_back

#define mt make_tuple

#define gcd __gcd

// Input

#define in(a) scanf("%d",&a)

#define in2(a,b) scanf("%d%d",&a,&b)

#define in3(a,b,c) scanf("%d%d%d",&a,&b,&c)

#define in4(a,b,c,d) scanf("%d%d%d%d",&a,&b,&c,&d)

#define inp(p) in2(p.F,p.S)

#define llin(a) cin >> a

#define llin2(a,b) cin >> a >> b

#define llin3(a,b,c) cin >> a >> b >> c

#define inl(a) scanf("%lld",&a)

#define read(v,i,n) for(i=0;i<n;i++)in(v[i])

#define twodread(mat,i,j,n,m) rep(i,n){rep(j,m)in(mat[i][j]);}

#define sc(ch) scanf("%c",&ch)

#define sstr(str) scanf("%s",str)

// Output

#define pr(a) printf("%d ",a)

#define pr2(a,b) printf("%d %d\n",a,b)

#define pr3(a,b,c) printf("%d %d %d\n",a,b,c)

#define prp(p) pr2(p.F,p.S)

#define out(a) printf("%d\n",a)

#define outl(a) printf("%lld\n",a)

#define llpr(a) cout << a << " "

#define llpr2(a,b) cout << a << " " << b << " "

#define llout(a) cout << a << "\n"

#define pinttwod(mat,i,j,n,m) rep(i,n){rep(j,m)pr(mat[i][j]);   lin;}

#define plltwod(mat,i,j,n,m)  rep(i,n){rep(j,m)llpr(mat[i][j]); lin;}

#define byes printf("YES\n")

#define bno printf("NO\n")

#define yes printf("Yes\n")

#define no printf("No\n")

#define lin printf("\n")

#define test(q) cout << "Case #" << q << ": "

// Iterator

#define rep(i,n) for(i=0;i<n;++i)

#define fone(i,n) for(i=1;i<=n;++i)

#define rrep(i,n) for(i=n-1;i>=0;--i)

#define lp(i,a,b) for(i=a;i<b;++i)

#define rlp(i,a,b) for(i=a;i>=b;--i)

#define all(vec) vec.begin(),vec.end()

#define lower(v,k) lower_bound(v.begin(),v.end(),k)-v.begin()

#define upper(v,k) upper_bound(v.begin(),v.end(),k)-v.begin()

#define tf(mytuple) get<0>(mytuple)

#define ts(mytuple) get<1>(mytuple)

#define tt(mytuple) get<2>(mytuple)

// function

#define sz(x) (int)x.size()

#define inrange(i,a,b) (i>=a && i<=b)

#define FLUSH fflush(stdout)

#define precision(x) cout << setprecision(x) << fixed

#define remax(a,b) a=max(a,b)

#define remin(a,b) a=min(a,b)

#define middle() ((l+h)/2)

#define lchild(p) 2*p

#define rchild(p) 2*p+1

#define lseg l,m,2*p

#define rseg m+1,h,2*p+1

#define bhardo(mat,i,j,n,m,t) rep(i,n){rep(j,m)mat[i][j]=t;}

#define bitcount(x)  __builtin_popcount(x)

#define bitcountll(x)  __builtin_popcountll(x)

#define biton(mask,i)  ((mask>>i)&1)

#define bitoff(mask,i) (!((mask>>i)&1))

#define toggle(mask,i) (mask^=(1<<(i)))

#define mul(p,q) ((ll)(p)*(ll)(q))

// Debug

#define dbg(v,i,n) for(i=0;i<n;i++)pr(v[i]); lin

#define ck printf("continue\n")

#define debug(args...) { string _s = #args; replace(_s.begin(), _s.end(), ',', ' '); stringstream _ss(_s); istream_iterator<string> _it(_ss); err(_it, args); }

void err(istream_iterator<string> it) {}

template<typename T, typename... Args>

void err(istream_iterator<string> it, T a, Args... args)

{

	cerr << *it << " = " << a << "\n";

	err(++it, args...);

}

// Data Type

#define ll long long int

#define ii pair<int,int>

#define pli pair<ll,int>

#define lii pair<ll,ll>

#define triple tuple<int,int,int>

#define vi vector<int>

#define vll vector<ll>

#define vii vector<pair<int,int> >

#define vvi vector<vector<int> >

#define viii vector<pair<pair<int,int>,int> >

#define vvii vector<vector<pair<int,int> > >

// Constant

const double PI = acos(-1);

const double eps = (1e-9);

const ll INF = 2e18;

const int M = (1e9)+7;

//const int M= 998244353;

const int N = (4e5)+3;  // check the limit, man

/**

 Have you worked on Simplification of Idea?

 Ok! let's code, check whether it is correct or not?

*/

struct binaryindextree

{

    int sum[N];

    void update(int j,int x)

    {

        if(j==0)

            return ;

        for(;j<N;j+=j&(-j))

            sum[j]+=x;

    }

    int query(int j)

    {

        int x=0;

        for(;j>0;j-=(j)&(-j))

            x+=sum[j];

        return x;

    }

};

int cnt[N];

void solve()

{

    int n,i,a,k;

    in(n);

    rep(i,n)

        in(a),cnt[a]++;

    vi v;

    rep(i,N)

        if(cnt[i]>0)v.pb(cnt[i]);

    binaryindextree cnt,total;

    for(auto a : v)

        cnt.update(a,1),total.update(a,a);

    int sum,new_sum;

    int m=sz(v);

    fone(k,n)

    {

        if(k>m)

            out(0);

        else

        {

            sum=(n/k);

            while(1)

            {

                new_sum=total.query(sum)+(m-cnt.query(sum))*sum;

                new_sum/=k;

                if(new_sum==sum)

                    break;

                sum=new_sum;

            }

            out(sum);

        }

    }

}

int main()

{

    int t=1;

    //in(t);

    while(t--)

        solve();

}














// Optimized solution to the same problem (faster):
#include<bits/stdc++.h>

using namespace std;

#define F first

#define S second

#define ignore ignore

#define pb emplace_back

#define mt make_tuple

#define gcd __gcd

// Input

#define in(a) scanf("%d",&a)

#define in2(a,b) scanf("%d%d",&a,&b)

#define in3(a,b,c) scanf("%d%d%d",&a,&b,&c)

#define in4(a,b,c,d) scanf("%d%d%d%d",&a,&b,&c,&d)

#define inp(p) in2(p.F,p.S)

#define llin(a) cin >> a

#define llin2(a,b) cin >> a >> b

#define llin3(a,b,c) cin >> a >> b >> c

#define inl(a) scanf("%lld",&a)

#define read(v,i,n) for(i=0;i<n;i++)in(v[i])

#define twodread(mat,i,j,n,m) rep(i,n){rep(j,m)in(mat[i][j]);}

#define sc(ch) scanf("%c",&ch)

#define sstr(str) scanf("%s",str)

// Output

#define pr(a) printf("%d ",a)

#define pr2(a,b) printf("%d %d\n",a,b)

#define pr3(a,b,c) printf("%d %d %d\n",a,b,c)

#define prp(p) pr2(p.F,p.S)

#define out(a) printf("%d\n",a)

#define outl(a) printf("%lld\n",a)

#define llpr(a) cout << a << " "

#define llpr2(a,b) cout << a << " " << b << " "

#define llout(a) cout << a << "\n"

#define pinttwod(mat,i,j,n,m) rep(i,n){rep(j,m)pr(mat[i][j]);   lin;}

#define plltwod(mat,i,j,n,m)  rep(i,n){rep(j,m)llpr(mat[i][j]); lin;}

#define byes printf("YES\n")

#define bno printf("NO\n")

#define yes printf("Yes\n")

#define no printf("No\n")

#define lin printf("\n")

#define test(q) cout << "Case #" << q << ": "

// Iterator

#define rep(i,n) for(i=0;i<n;++i)

#define fone(i,n) for(i=1;i<=n;++i)

#define rrep(i,n) for(i=n-1;i>=0;--i)

#define lp(i,a,b) for(i=a;i<b;++i)

#define rlp(i,a,b) for(i=a;i>=b;--i)

#define all(vec) vec.begin(),vec.end()

#define lower(v,k) lower_bound(v.begin(),v.end(),k)-v.begin()

#define upper(v,k) upper_bound(v.begin(),v.end(),k)-v.begin()

#define tf(mytuple) get<0>(mytuple)

#define ts(mytuple) get<1>(mytuple)

#define tt(mytuple) get<2>(mytuple)

// function

#define sz(x) (int)x.size()

#define inrange(i,a,b) (i>=a && i<=b)

#define FLUSH fflush(stdout)

#define precision(x) cout << setprecision(x) << fixed

#define remax(a,b) a=max(a,b)

#define remin(a,b) a=min(a,b)

#define middle() ((l+h)/2)

#define lchild(p) 2*p

#define rchild(p) 2*p+1

#define lseg l,m,2*p

#define rseg m+1,h,2*p+1

#define bhardo(mat,i,j,n,m,t) rep(i,n){rep(j,m)mat[i][j]=t;}

#define bitcount(x)  __builtin_popcount(x)

#define bitcountll(x)  __builtin_popcountll(x)

#define biton(mask,i)  ((mask>>i)&1)

#define bitoff(mask,i) (!((mask>>i)&1))

#define toggle(mask,i) (mask^=(1<<(i)))

#define mul(p,q) ((ll)(p)*(ll)(q))

// Debug

#define dbg(v,i,n) for(i=0;i<n;i++)pr(v[i]); lin

#define ck printf("continue\n")

#define debug(args...) { string _s = #args; replace(_s.begin(), _s.end(), ',', ' '); stringstream _ss(_s); istream_iterator<string> _it(_ss); err(_it, args); }

void err(istream_iterator<string> it) {}

template<typename T, typename... Args>

void err(istream_iterator<string> it, T a, Args... args)

{

	cerr << *it << " = " << a << "\n";

	err(++it, args...);

}

// Data Type

#define ll long long int

#define ii pair<int,int>

#define pli pair<ll,int>

#define lii pair<ll,ll>

#define triple tuple<int,int,int>

#define vi vector<int>

#define vll vector<ll>

#define vii vector<pair<int,int> >

#define vvi vector<vector<int> >

#define viii vector<pair<pair<int,int>,int> >

#define vvii vector<vector<pair<int,int> > >

// Constant

const double PI = acos(-1);

const double eps = (1e-9);

const ll INF = 2e18;

const int M = (1e9)+7;

//const int M= 998244353;

const int N = (3e5)+3;  // check the limit, man

/**

 Have you worked on Simplification of Idea?

 Ok! let's code, check whether it is correct or not?

*/

struct binaryindextree

{

    int sum[N];

    void update(int j,int x)

    {

        if(j==0)

            return ;

        for(;j<N;j+=j&(-j))

            sum[j]+=x;

    }

    int query(int j)

    {

        int x=0;

        for(;j>0;j-=(j)&(-j))

            x+=sum[j];

        return x;

    }

};

int ar[N];

binaryindextree cnt,total;

void solve()

{

    int n,i,a,k;

    in(n);

    rep(i,n)

        in(a),ar[a]++;

    vi v;

    rep(i,N)

        if(ar[i]>0)v.pb(ar[i]);

    for(auto a : v)

        cnt.update(a,1),total.update(a,a);

    int sum,new_sum;

    int m=sz(v);

    fone(k,n)

    {

        if(k>m)

            sum=0;

        else

        {

            sum=(n/k);

            while(1)

            {

                new_sum=total.query(sum)+(m-cnt.query(sum))*sum;

                new_sum/=k;

                if(new_sum==sum)

                    break;

                sum=new_sum;

            }

        }

        out(sum);

    }

}

int main()

{

    int t=1;

    //in(t);

    while(t--)

        solve();

}














// Fastest known solution for this problem: