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

using namespace std;

map<int,int> wyst;
vector<int> wiel;

bool testl(const vector<int> &wiel, int licz) {
	vector<int> wm;
	int ind, fv;
	ind = 0;
	for (auto i: wiel) {
		if (ind >= licz)
			wm.push_back(i);
		ind++;
	}
	ind = 0;
	for (int lid = 0; lid < licz; lid++) {
		fv = wiel[lid];
		while (ind < wm.size()) {
			if (wm[ind] < fv) {
				fv -= wm[ind];
				ind++;
			} else {
				wm[ind] -= (fv - 1);
				break;
			}
		};
	}
	return wm.size() == ind;
}

int main() {
	ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

	int liczba, el;

	cin >> liczba;
	
    for (int i=0; i < liczba; i++) {
		cin >> el;
        wyst[el]+=1;
	}
    for (auto i: wyst)
		wiel.push_back(i.second);
	sort(wiel.begin(), wiel.end(), greater<int>()); 
	int lewy, prawy, sr;
	lewy = 1;
	prawy = liczba;
	while (lewy < prawy) {
		sr = (lewy + prawy)/2;
		// cout << lewy << " " << sr << " "  << prawy << " \n";

		if (sr == lewy) {
			if (testl(wiel,lewy)) {
				cout << lewy << "\n";
				return 0;
			} else {
				cout << prawy << "\n";
				return 0;
			};
		} else {
				if (testl(wiel, sr))
					prawy = sr;
				else
					lewy = sr;
		}
	}
	cout << 1 << "\n";
	// cout << 1 << " == " << testl(wiel, 1) << "\n";
	// cout << 2 << " == " << testl(wiel, 2) << "\n";
	// cout << 3 << " == " << testl(wiel, 3) << "\n";
	// for (auto i: wiel)
        // cout << i<< " ";
	// cout << "\n";
		// for (auto i: wm) 
			// cout << i.second << " ";
		// cout << " koniec\n";

}