#include <bits/stdc++.h>
using namespace std;
void fre() {
  freopen("c://test//input.in", "r", stdin);
  freopen("c://test//output.out", "w", stdout);
}
template <class T1, class T2>
inline void gmax(T1 &a, T2 b) {
  if (b > a) a = b;
}
template <class T1, class T2>
inline void gmin(T1 &a, T2 b) {
  if (b < a) a = b;
}
const int N = 1e6 + 10, M = 0, Z = 1e9 + 7, ms63 = 1061109567;
int casenum, casei;
map<int, int> mop;
map<int, int>::iterator it;
int n, k;
long long l;
int a[N];
int s[2][N];
int sum[N];
void add(int &x, int y) {
  x += y;
  if (x >= Z) x -= Z;
}
int main() {
  while (~scanf("%d%lld%d", &n, &l, &k)) {
    mop.clear();
    for (int i = 0; i < n; i++) {
      scanf("%d", &a[i]);
      mop[a[i]] = 0;
    }
    int top = 0;
    for (it = mop.begin(); it != mop.end(); ++it) it->second = top++;
    for (int i = 0; i < n; i++) a[i] = mop[a[i]];
    int ans = l % Z;
    memset(s, 0, sizeof(s));
    for (int i = 0; i < n; i++) ++s[0][a[i]];
    for (int i = 0; i < top; i++) s[0][i] += s[0][i - 1];
    memcpy(sum, s[0], sizeof(sum));
    long long len = l / n;
    int rst = l % n;
    int tak = min((long long)k, len);
    int u = 0;
    int v = 1;
    for (int tim = 2; tim <= tak; tim++) {
      for (int j = 0; j < top; j++) s[v][j] = 0;
      for (int j = 0; j < n; j++) add(s[v][a[j]], s[u][a[j]]);
      for (int j = 1; j < top; j++) add(s[v][j], s[v][j - 1]);
      if (tim < k)
        for (int j = 0; j < top; j++) add(sum[j], s[v][j]);
      long long num = (len + 1 - tim) % Z;
      add(ans, num * s[v][top - 1] % Z);
      u ^= 1;
      v ^= 1;
    }
    if (rst && len >= 1 && k >= 2)
      for (int j = 0; j < rst; j++) add(ans, sum[a[j]]);
    printf("%d\n", ans);
  }
  return 0;
}
