#include <bits/stdc++.h>
using namespace std;
struct ii {
  long long a, b;
  bool operator<(ii o) const { return make_tuple(a, b) < make_tuple(o.a, o.b); }
};
struct iii {
  int a, b, c;
  bool operator<(iii o) const {
    return make_tuple(a, b, c) < make_tuple(o.a, o.b, o.c);
  }
};
long long TC, N, M, K, Q, x, y, z;
deque<ii> dq;
int main() {
  scanf("%lld%lld%lld", &N, &K, &M);
  for (int i = 0; i < N; i++) {
    scanf("%lld", &x);
    if (!dq.empty() && dq.back().a == x)
      dq.back().b++;
    else
      dq.push_back({x, 1});
    if (dq.back().b == K) dq.pop_back();
  }
  int ptr1 = 0, ptr2 = (int)(dq).size() - 1;
  while (ptr1 < ptr2 && dq[ptr1].a == dq[ptr2].a &&
         dq[ptr1].b + dq[ptr2].b == K)
    ptr1++, ptr2--;
  if (ptr1 < ptr2) {
    long long ans = 0;
    for (int i = 0; i <= ptr2; i++) ans += dq[i].b;
    for (int i = ptr1; i <= ptr2; i++) ans += dq[i].b * (M - 2);
    for (int i = ptr1; i < (int)(dq).size(); i++) ans += dq[i].b;
    if (dq[ptr1].a == dq[ptr2].a && dq[ptr1].b + dq[ptr2].b > K)
      ans -= K * (M - 1);
    printf("%lld\n", ans);
  } else {
    int batas = -1;
    if (ptr1 == ptr2) {
      batas = dq[ptr1].b * M % K;
      if (batas == 0) ptr1++, ptr2--;
    } else
      batas = 0;
    if (batas == 0) {
      deque<ii> tmp;
      for (int i = 0; i <= ptr2; i++) tmp.push_back(dq[i]);
      for (int i = ptr1; i < (int)(dq).size(); i++) {
        if (!tmp.empty() && tmp.back().a == dq[i].a)
          tmp.back().b += dq[i].b;
        else
          tmp.push_back(dq[i]);
        if (tmp.back().b >= K) tmp.back().b -= K;
        if (tmp.back().b == 0) tmp.pop_back();
      }
      long long ans = 0;
      for (auto i : tmp) ans += i.b;
      printf("%lld\n", ans);
    } else {
      long long ans = dq[ptr1].b * M % K;
      for (int i = 0; i < ptr2; i++) ans += dq[i].b;
      for (int i = ptr1 + 1; i < (int)(dq).size(); i++) ans += dq[i].b;
      printf("%lld\n", ans);
    }
  }
  return 0;
}
