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;
using uint = unsigned;
using ll = long long;
using ull = unsigned long long;
using vi = vector<int>;
using vvi = vector<vi>;
using vl = vector<ll>;
using vvl = vector<vl>;
using vd = vector<double>;
using vvd = vector<vd>;
using vs = vector<string>;
void print_vars(ostream&) {}
template <typename Car, typename... Cdr>
void print_vars(ostream& os, const Car& car, const Cdr&... cdr) {
  print_vars(os << car << (sizeof...(cdr) ? "," : ""), cdr...);
}
template <typename T1, typename T2>
ostream& operator<<(ostream& os, const pair<T1, T2>& p) {
  return os << '(' << p.first << ',' << p.second << ')';
}
template <int I, typename Tuple>
void print_tuple(ostream&, const Tuple&) {}
template <int I, typename Car, typename... Cdr, typename Tuple>
void print_tuple(ostream& os, const Tuple& t) {
  os << get<I>(t) << (sizeof...(Cdr) ? "," : "");
  print_tuple<I + 1, Cdr...>(os, t);
}
template <typename... Args>
ostream& operator<<(ostream& os, const tuple<Args...>& t) {
  print_tuple<0, Args...>(os << '(', t);
  return os << ')';
}
template <typename Ch, typename Tr, typename C>
basic_ostream<Ch, Tr>& operator<<(basic_ostream<Ch, Tr>& os, const C& c) {
  os << '[';
  for (auto i = begin(c); i != end(c); ++i)
    os << (i == begin(c) ? "" : " ") << *i;
  return os << ']';
}
constexpr int INF = 1e9;
constexpr int MOD = 1e9 + 7;
constexpr double EPS = 1e-9;
vector<tuple<ll, ll>> compress(const vector<tuple<ll, ll>>& b, ll n, ll k) {
  vector<tuple<ll, ll>> res;
  ll cur = -1, cnt = 0;
  for (int i = int(0); i < int(b.size()); i++) {
    ll x, c;
    tie(x, c) = b[i];
    if (x != cur) {
      if (cur != -1) res.emplace_back(cur, cnt);
      cur = x, cnt = c;
    } else {
      (cnt += c) %= k;
      if (cnt == 0) {
        if (res.empty())
          cur = -1;
        else {
          tie(cur, cnt) = res.back();
          res.pop_back();
        }
      }
    }
  }
  if (cnt > 0) res.emplace_back(cur, cnt);
  if (res.size() > 2 * n) {
    int l = n, r = res.size() - n;
    ll cnt = 0;
    for (int i = int(l); i < int(r); i++) cnt += get<1>(res[i]);
    res.erase(begin(res) + l, begin(res) + r);
    res.emplace(begin(res) + l, INF, cnt);
  }
  return res;
}
ll solve(ll n, ll k, ll m, vl a) {
  vector<vector<tuple<ll, ll>>> b(30);
  {
    vector<tuple<ll, ll>> t;
    for (int i = int(0); i < int(n); i++) t.emplace_back(a[i], 1);
    b[0] = compress(t, n, k);
  }
  for (int i = int(1); i < int(b.size()); i++) {
    vector<tuple<ll, ll>> t = b[i - 1];
    t.insert(end(t), begin(b[i - 1]), end(b[i - 1]));
    b[i] = compress(t, n, k);
  }
  vector<tuple<ll, ll>> c;
  for (int i = int(0); i < int(30); i++)
    if (m >> i & 1) {
      c.insert(end(c), begin(b[i]), end(b[i]));
      c = compress(c, n, k);
    }
  ll res = 0;
  for (auto t : c) res += get<1>(t);
  return res;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  constexpr char endl = '\n';
  for (ll n, k, m; cin >> n >> k >> m && n | k | m;) {
    vl a(n);
    for (int i = int(0); i < int(n); i++) cin >> a[i];
    cout << solve(n, k, m, a) << endl;
  }
}
