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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
// Author: Bartek Knapik

#include <cstdio>

const int MAX_N = 300000 + 9;

int stamps[MAX_N], tmp[MAX_N], counter[MAX_N];
int n, ans, n_cities;

void sort(int* data, int begin, int end)
{
    if (end - begin <= 1) return;
    
    int mid = (begin + end) / 2;
    
    sort(data, begin, mid);
    sort(data, mid, end);
    
    int a = begin;
    int b = mid;
    int c = 0;
    
    while (a < mid && b < end)
    {
        if (data[a] > data[b]) tmp[c++] = data[a++];
        else tmp[c++] = data[b++];
    }
    
    while (a < mid) tmp[c++] = data[a++];
    while (b < end) tmp[c++] = data[b++];
    
    c = 0;
    
    while (begin < end) data[begin++] = tmp[c++];
}

void get_counter()
{
    int prev_val, count;
    
    prev_val = stamps[0];
    count = 1;
    n_cities = 0;
    
    for (int i = 1; i < n; ++i)
    {
        if (prev_val != stamps[i])
        {
            counter[n_cities++] = count;
            count = 1;
            prev_val = stamps[i];
        }
        else count++;
    }
    counter[n_cities++] = count;
}


int main()
{
    scanf("%d", &n);
    
    for (int i = 0; i < n; ++i) scanf("%d", &stamps[i]);
    
    sort(stamps, 0, n);
    
    get_counter();
    
    sort(counter, 0, n_cities);
    
    for (int i = 1; i <= n; ++i)
    {
        ans = 0;
        
        for (int j = 0; j < n_cities; ++j)
        {
            ans += (counter[j] / i) * i;
            if (counter[j] / i == 0)
                n_cities = j;
        }
        
        printf("%d ", ans);
    }
    
    printf("\n");
    
    return 0;
}