#include <bits/stdc++.h>
#pragma GCC optimize("Ofast", "unroll-loops", "omit-frame-pointer", "inline")
#pragma GCC option("arch=native", "tune=native", "no-zero-upper")
#pragma GCC target("avx2")
using namespace std;
map<int, int> t;
int a[(long long)(1e6 + 5)];
long long qp(long long b, long long e) {
  if (!e) return 1;
  long long x = qp(b, e / 2);
  x = (x * x) % (long long)(1e9 + 7);
  if (e & 1) x = (x * b) % (long long)(1e9 + 7);
  return x;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  long long n, l, k;
  cin >> n >> l >> k;
  set<int> second;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
    second.insert(a[i]);
  }
  int cont = 0;
  for (auto y : second) {
    t[y] = cont;
    cont++;
  }
  for (int i = 0; i < n; i++) a[i] = t[a[i]];
  vector<vector<long long> > dp;
  vector<vector<long long> > ac;
  for (int i = 0; i <= k; i++) {
    dp.push_back(vector<long long>(n + 1));
    ac.push_back(vector<long long>(n + 1));
  }
  for (int i = 0; i <= n; i++) ac[0][i] = 1;
  for (int i = 0; i < k; i++) {
    for (int j = 0; j < n; j++) {
      dp[i + 1][j] = ac[i][a[j]];
      ac[i + 1][a[j]] = (ac[i + 1][a[j]] + dp[i + 1][j]) % (long long)(1e9 + 7);
    }
    for (int j = 1; j <= n; j++)
      ac[i + 1][j] = (ac[i + 1][j - 1] + ac[i + 1][j]) % (long long)(1e9 + 7);
  }
  vector<long long> c0;
  c0.push_back(1);
  long long x = (l - 1) / n + 1;
  for (long long i = 0; i < min(k, x); i++) {
    long long den = qp(i + 1, (long long)(1e9 + 7) - 2);
    long long num = (x - i) % (long long)(1e9 + 7);
    long long f1 = c0.back();
    f1 = (f1 * num) % (long long)(1e9 + 7);
    f1 = (f1 * den) % (long long)(1e9 + 7);
    c0.push_back(f1);
  }
  while (c0.size() <= k) c0.push_back(0);
  vector<long long> c1;
  c1.push_back(1);
  x--;
  for (long long i = 0; i < min(k, x); i++) {
    long long den = qp(i + 1, (long long)(1e9 + 7) - 2);
    long long num = (x - i) % (long long)(1e9 + 7);
    long long f1 = c1.back();
    f1 = (f1 * num) % (long long)(1e9 + 7);
    f1 = (f1 * den) % (long long)(1e9 + 7);
    c1.push_back(f1);
  }
  while (c1.size() <= k) c1.push_back(0);
  long long res = 0;
  long long lim = l % n;
  if (!lim) lim = n;
  for (int i = 0; i < n; i++) {
    if (i < lim) {
      long long cant = x + 1;
      for (int j = 1; j <= k; j++)
        if (cant >= j)
          res = (res + ((cant - j + 1) % (long long)(1e9 + 7)) * dp[j][i]) %
                (long long)(1e9 + 7);
    } else {
      long long cant = x;
      cant %= (long long)(1e9 + 7);
      for (int j = 1; j <= k; j++)
        if (cant >= j)
          res = (res + ((cant - j + 1) % (long long)(1e9 + 7)) * dp[j][i]) %
                (long long)(1e9 + 7);
    }
  }
  cout << (res) << '\n';
  return 0;
}
