#include <bits/stdc++.h>
using namespace std;
const int N = (int)1e6 + 5;
const int MOD = (int)1e9 + 7;
void add_to(int &a, int b) {
  a += b;
  if (a >= MOD) a -= MOD;
}
int mul(int a, int b) { return (long long)a * b % MOD; }
int n, k;
long long l;
int a[N];
int perm[N];
int dp_from[N], dp_to[N];
int answer;
struct Cmp {
  bool operator()(int x, int y) const { return a[x] < a[y]; }
};
void add_to_result(int it) {
  long long blocks = l / n;
  int last_piece = l % n;
  int full = max(0LL, blocks - it + 1) % MOD;
  for (int i = 0; i < n; i++) {
    add_to(answer, mul(dp_from[i], full));
    if (it <= blocks + 1 && i < last_piece) add_to(answer, dp_from[i]);
  }
}
void solve() {
  scanf("%d%lld%d", &n, &l, &k);
  for (int i = 0; i < n; i++) scanf("%d", &a[i]);
  for (int i = 0; i < n; i++) perm[i] = i;
  sort(perm, perm + n, Cmp());
  for (int i = 0; i < n; i++) dp_from[i] = 1;
  for (int it = 1; it <= k; it++) {
    add_to_result(it);
    if (it == k) continue;
    fill(dp_to, dp_to + n, 0);
    int pos = 0;
    int sum = 0;
    for (int i = 1; i <= n; i++)
      if (i == n || a[perm[i]] != a[perm[pos]]) {
        for (int j = pos; j < i; j++) add_to(sum, dp_from[perm[j]]);
        for (int j = pos; j < i; j++) add_to(dp_to[perm[j]], sum);
        pos = i;
      }
    copy(dp_to, dp_to + n, dp_from);
  }
  printf("%d\n", answer);
}
int main() {
  solve();
  0;
  return 0;
}
