10 5 1000000000
1 1 1 2 2 1 2 2 2 2
 5 3 3
1 2 2 1 1
 2 4 1
1 1
 1 1000000000 1000000000
100000
 5 3 2
1 1 2 1 1
 5 2 4
1 2 3 2 1
 1 10 10
1

10000000000
 0
 2
 0
 7
 0
 0

#include <bits/stdc++.h>
using namespace std;
const int INF = 1000000404;
const long long MOD = 1000000007ll;
const long double PI = acos(-1.0);
const long double EPS = 1e-9;
template <typename t1, typename t2>
inline void upmax(t1 &a, t2 b) {
  a = max(a, (t1)b);
}
template <typename t1, typename t2>
inline void upmin(t1 &a, t2 b) {
  a = min(a, (t1)b);
}
template <typename T>
inline T gcd(T a, T b) {
  return b ? gcd(b, a % b) : a;
}
template <typename T>
inline T lcm(T a, T b) {
  return a * (b / gcd(a, b));
}
template <typename T>
inline T sqr(T a) {
  return a * a;
}
template <typename T>
inline bool pal(T &x) {
  int n = (int((x.size())));
  for (int i = 0; i < n / 2; i++) {
    if (x[i] != x[n - i - 1]) return 0;
  }
  return 1;
}
template <typename T>
inline void rev(T &x) {
  int n = (int((x.size())));
  for (int i = 0; i < n / 2; i++) swap(x[i], x[n - i - 1]);
}
int month[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int dx[] = {1, 0, -1, 0, 1, 1, -1, -1};
int dy[] = {0, 1, 0, -1, 1, -1, 1, -1};
inline long long mp(long long a, long long b) { return (a << 31) + b; }
class compare {
 public:
  bool operator()(const int a, const int b) const { return 1; }
};
int SQ = 400;
struct node {
  long long len;
  vector<pair<long long, long long> > v;
};
node ret;
int k, n;
int timer = -5;
long long scatter(vector<pair<long long, long long> > &a,
                  vector<pair<long long, long long> > &res) {
  long long ret = 0;
  for (auto &x : a) {
    if (!res.empty() && x.first == res.back().first) {
      long long &cnt = res.back().second;
      cnt += x.second;
      if (cnt >= k) {
        ret += cnt / k * k;
        cnt %= k;
        if (cnt == 0) res.pop_back();
      }
    } else {
      long long cnt = x.second;
      if (cnt >= k) {
        ret += cnt / k * k;
        cnt %= k;
        if (cnt != 0) res.push_back(make_pair(x.first, cnt));
      } else
        res.push_back(x);
    }
  }
  if ((int((res.size()))) > 210000) {
    vector<pair<long long, long long> > v;
    v.resize(105000);
    for (int i = 0; i < 105000; i++) v[i] = res[i];
    v.push_back(make_pair(timer--, 1));
    for (int i = (int((res.size()))) - 1; i >= (int((res.size()))) - 105000;
         i--)
      v.push_back(res[i]);
    res = v;
  }
  return ret;
}
long long merge(vector<pair<long long, long long> > &a,
                vector<pair<long long, long long> > &b,
                vector<pair<long long, long long> > &res) {
  if (a.empty() && b.empty()) return 0;
  for (auto &x : b) a.push_back(x);
  long long ret = scatter(a, res);
  return ret;
}
node get(int m) {
  if (m == 1) return ret;
  node a = get(m / 2);
  node b = a;
  node c;
  c.len = a.len + b.len - merge(a.v, b.v, c.v);
  if (m % 2) {
    node res;
    node one = ret;
    res.len = c.len + ret.len - merge(c.v, ret.v, res.v);
    return res;
  }
  return c;
}
void solve() {
  int m;
  cin >> n >> k >> m;
  vector<pair<long long, long long> > v;
  for (int i = 0; i < n; i++) {
    int x;
    cin >> x;
    v.push_back(make_pair(x, 1));
  }
  ret.len = n - scatter(v, ret.v);
  node x = get(m);
  cout << x.len << endl;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int t = 1;
  while (t--) {
    solve();
  };
  getchar();
  getchar();
  return 0;
}
