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;
deque<pair<int, int> > fila;
int fixitplox(deque<pair<int, int> > elementos) {
  int result = 0;
  for (int i = 0; i < elementos.size(); i++) result += elementos[i].second;
  return result;
}
int main() {
  int n, k, m, temp;
  cin >> n >> k >> m;
  cin >> temp;
  int cant = 1;
  fila.emplace_back(temp, 1);
  for (int i = 0; i < n - 1; i++) {
    cin >> temp;
    if (temp == (fila[cant - 1].first)) {
      fila[cant - 1].second++;
      if (fila[cant - 1].second == k) {
        fila.pop_back();
        cant--;
      }
    } else {
      fila.emplace_back(temp, 1);
      cant++;
    }
  }
  if (m == 1) {
    cout << fixitplox(fila);
    return 0;
  }
  int eliminados = 0;
  bool puedo = true;
  while (puedo) {
    if ((fila[0].first == fila[cant - 1].first) && (cant > 1)) {
      temp = fila[0].second + fila[cant - 1].second;
      if (temp >= k) {
        int kek = min(fila[0].second, k);
        eliminados += k;
        fila[0].second -= kek;
        fila[cant - 1].second -= k - kek;
        if (fila[0].second == 0) {
          fila.pop_front();
          cant--;
        }
        if (fila[cant].second == 0) {
          fila.pop_back();
          cant--;
        }
      }
    } else
      puedo = false;
  }
  if (cant == 1) {
    temp = fila[0].second;
    m %= k;
    int i = 1;
    while (m > 1) {
      i = min(1000, m);
      temp *= i;
      temp %= k;
      m -= i;
    }
    if (m == 0) {
      cout << 0;
      return 0;
    }
    cout << (temp + eliminados);
    return 0;
  }
  temp = fixitplox(fila);
  cout << (temp * m + eliminados);
  return 0;
}
