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
#include<cstdio>
#include<vector>
#include<algorithm>

using namespace std;

int main() {
    int n;
    scanf("%d", &n);

    vector<long long> v;
    vector<int> c;

    for (int i = 0; i < n; i++) {
        long long a;
        scanf("%lld", &a);
        v.push_back(a);
    }

    sort(v.begin(), v.end());

    //for (auto it = v.begin(); it != v.end(); ++it) {
    //    printf("%d ", *it);
    //}
    //printf("\n");

    int counter = 1;
    for (int i = 0; i < n - 1; i++) {
        if (v[i] == v[i + 1]) {
            counter++;
        }
        else {
            c.push_back(counter);
            counter = 1;
        }

        if (i == n - 2) {
            if (v[i] == v[i + 1]) {
                c.push_back(counter);
            }
            else {
                c.push_back(1);
            }
        }
    }

    if (n == 1) {
        c.push_back(1);
    }

    sort(c.begin(), c.end());

    for (int i = 1; i <= n; i++) {
        int result = 0;

        for (auto it = c.rbegin(); it != c.rend(); ++it) {
            int x = *it;
            if (x >= i) {
                result += (x / i) * i;
            }
            else {
                break;
            }
        }    

        printf("%d ", result);
    }

    return 0;
}