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>
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
long long MOD = 1e9 + 7;
long long d[2][10];
long long op(char c, long long a, long long b) {
  if (c == '|') {
    return b | a;
  }
  if (c == '&') {
    return b & a;
  }
  if (c == '^') {
    return b ^ a;
  }
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  long long n, k, m;
  cin >> n >> k >> m;
  long long aold = -1, a;
  vector<pair<long long, long long> > mem;
  for (int i = 0; i < n; i++) {
    cin >> a;
    if (aold == a) {
      if (!mem.size()) {
        while (true) {
          long long kek = 1;
        }
      }
      mem[mem.size() - 1].second++;
      if (mem[mem.size() - 1].second == k) {
        mem.pop_back();
        if (mem.size())
          aold = mem[mem.size() - 1].first;
        else
          aold = -1;
      } else {
        aold = a;
      }
    } else {
      mem.push_back({a, 1});
      aold = a;
    }
  }
  if (mem.size() == 0) {
    cout << n * m % k;
    return 0;
  }
  if (mem.size() == 1) {
    cout << mem[0].second * m % k;
    return 0;
  }
  if (m == 1) {
    long long ans = 0;
    for (auto i : mem) {
      ans += i.second;
    }
    cout << ans;
    return 0;
  }
  long long l = 0, r = mem.size() - 1;
  long long gv = 0;
  while (l < r && (mem[l].first == mem[r].first) &&
         ((mem[l].second + mem[r].second) % k == 0)) {
    l++;
    r--;
  }
  long long ans = 0;
  if (l >= r) {
    if (l == r) {
      if (mem[l].second * m % k == 0) {
        vector<pair<long long, long long> > kek;
        for (int i = 0; i < l; i++) {
          kek.push_back(mem[i]);
        }
        for (int i = r + 1; i < mem.size(); i++) {
          if (kek.size() && kek[kek.size() - 1].first == mem[i].first) {
            if ((kek[kek.size() - 1].second + mem[i].second) % k == 0)
              kek.pop_back();
            else {
              kek[kek.size() - 1].second += mem[i].second;
              kek[kek.size() - 1].second %= k;
            }
          } else {
            kek.push_back(mem[i]);
          }
        }
        ans = 0;
        for (auto i : kek) {
          ans += i.second;
        }
        cout << ans;
        return 0;
      } else {
        ans = 0;
        for (int i = 0; i < mem.size(); i++) {
          if (i == l) {
            ans += mem[l].second * m % k;
          } else {
            ans += mem[i].second;
          }
        }
        cout << ans;
        return 0;
      }
    }
  } else {
    if (l < r && mem[l].first == mem[r].first) {
      gv = (mem[l].second + mem[r].second) / k * k;
    }
    for (int i = l; i <= r; i++) {
      ans += mem[i].second;
    }
    if (m > 1) ans *= (m - 2);
    ans -= gv * (m - 1);
  }
  for (int i = 0; i <= r; i++) {
    ans += mem[i].second;
  }
  for (int i = l; i < mem.size(); i++) {
    ans += mem[i].second;
  }
  cout << ans;
}
