1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 3e5 + 7;
long long t[MAXN];
long long odp[MAXN];
long long wystapienia[MAXN];

map<int, long long> mapa;
vector<int> vctr;

bool com(int a, int b)
{
    if(a >= b) return 1;
    else return 0;
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    int n, x = 0;
    long long naj = 0;
    cin >> n;
    for(int i = 0; i < n; i++)
    {
        cin >> t[i];
        mapa[t[i]]; // tworzenie komorki w mapie
    }

    for(auto it = mapa.begin(); it != mapa.end(); it++) it -> second = x++;
    for(int i = 0; i < n; i++) t[i] = mapa[t[i]];

    for(int i = 0; i < n; i++)
        wystapienia[t[i]]++;

    for(int i = 0; i < n; i++)
        {if(wystapienia[i]) vctr.push_back(wystapienia[i]); naj = max(naj, wystapienia[i]);}

    sort(vctr.begin(), vctr.end(), com);

    for(int i = 1; i <= naj; i++)
    {
        for(auto w : vctr)
        {
            if(w >= i)
                odp[i] += w - (w%i);
            else break;
        }
    }

    for(int i = 1; i <= n; i++)
        cout << odp[i] << ' ';
    return 0;
}