#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:64000000")
using namespace std;
const int MAXN = 1000010;
int n, k;
long long l;
pair<int, int> a[MAXN];
vector<vector<int> > d, p;
int ans;
int ptr;
int nxt[MAXN];
long long cnt[MAXN];
inline int add(int q1, int q2) { return (q1 + q2) % 1000000007; }
inline int mul(int q1, int q2) {
  return (long long)q1 * (long long)q2 % 1000000007;
}
inline void calcPref(int num) {
  for (int i = 0; i <= n; i++) {
    p[num][i] = d[num][i];
    if (i) {
      p[num][i] = add(p[num][i], p[num][i - 1]);
    }
  }
}
void solve() {
  scanf("%d%I64d%d", &n, &l, &k);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i].first);
    a[i].second = i;
    cnt[i] = l / n;
    if (l % n >= i) {
      cnt[i]++;
    }
  }
  sort(a + 1, a + n + 1);
  ptr = n;
  for (int i = n; i >= 1; i--) {
    while (a[ptr].first > a[i].first) {
      ptr--;
    }
    nxt[i] = ptr;
  }
  d.resize(k + 1);
  p.resize(k + 1);
  for (int j = 0; j <= k; j++) {
    d[j].resize(n + 1, 0);
    p[j].resize(n + 1, 0);
  }
  d[0][0] = 1;
  calcPref(0);
  for (int j = 1; j <= k; j++) {
    for (int i = n; i >= 1; i--) {
      if (j <= cnt[a[i].second]) {
        d[j][i] = p[j - 1][nxt[i]];
        ans = add(ans, mul(d[j][i], (cnt[a[i].second] - j + 1) % 1000000007));
      }
    }
    calcPref(j);
  }
  cout << ans;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  srand(1337);
  solve();
  return 0;
}
