#pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #include #include using namespace std; typedef long long ll; const int INF = 1<<30; const ll INFLL = 1LL<<60; //const ll MOD = 998244353; const double INFD = 1.0E10; const int dx[4] = {1, 0, -1, 0}; const int dy[4] = {0, -1, 0, 1}; //const int dx[8] = {1, 1, 0, -1, -1, -1, 0, 1}; //const int dy[8] = {0, 1, 1, 1, 0, -1, -1, -1}; using Pair = pair; using Graph = vector>; using mint = atcoder::modint998244353; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); cout << fixed << setprecision(15); ll n, m, t; cin >> n >> m >> t; vector a(m); for (int i = 0; i < m; i++){ cin >> a[i]; a[i]--; } ll ng = 0, ok = INFLL; while (ok - ng > 1){ ll mid = (ok + ng) / 2; vector cnt(n); ll rem = 0; for (int i = 0; i < m; i++){ if (cnt[a[i]] >= mid) rem++; else cnt[a[i]]++; } priority_queue, greater> pq; for (int i = 0; i < n; i++) pq.push(cnt[i]); while (!pq.empty() && rem > 0){ ll v = pq.top(); pq.pop(); if (v + t <= mid){ pq.push(v + t); rem--; } } if (rem == 0) ok = mid; else ng = mid; } cout << ok << endl; return 0; }