#include <bits/stdc++.h>
using namespace std;
inline int IN() {
  int x = 0, ch = getchar(), f = 1;
  while (!isdigit(ch) && (ch != '-') && (ch != EOF)) ch = getchar();
  if (ch == '-') {
    f = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = (x << 1) + (x << 3) + ch - '0';
    ch = getchar();
  }
  return x * f;
}
struct Num {
  int val;
  bool pre;
  bool operator<(const Num& x) const { return val < x.val; }
} a[1000005];
long long l, Sum;
int n, k, Rem;
vector<long long> f[1000005];
int main() {
  scanf("%d%I64d%d", &n, &l, &k);
  Sum = (l - 1) / n + 1;
  Rem = (l - 1) % n;
  for (int i = 0; i <= n - 1; i++) a[i].val = IN();
  for (int i = 0; i <= Rem; i++) a[i].pre = 1;
  for (int i = Rem + 1; i <= n - 1; i++) a[i].pre = 0;
  sort(a, a + n);
  for (int i = 0; i <= n - 1; i++) f[1].push_back(1);
  for (int i = 2; i <= ((k) < (Sum) ? (k) : (Sum)); i++) {
    long long s = 0;
    for (int j = 0; j <= n - 1; j++) {
      int st = j;
      while (j < n - 1 && a[j].val == a[j + 1].val) j++;
      for (int k = st; k <= j; k++) (s += f[i - 1][k]) %= 1000000007;
      for (int k = st; k <= j; k++) f[i].push_back(s);
    }
  }
  long long Ans = 0;
  for (int i = 0; i <= n - 1; i++) {
    if (a[i].pre)
      for (int j = 1; j <= ((k) < (Sum) ? (k) : (Sum)); j++)
        (Ans += (Sum - j + 1) % 1000000007 * f[j][i] % 1000000007) %=
            1000000007;
    else
      for (int j = 1; j <= ((k) < (Sum - 1) ? (k) : (Sum - 1)); j++)
        (Ans += (Sum - j) % 1000000007 * f[j][i] % 1000000007) %= 1000000007;
  }
  printf("%d\n", Ans);
}
