#include <bits/stdc++.h>
using namespace std;
template <typename T, typename TT>
ostream &operator<<(ostream &s, pair<T, TT> t) {
  return s << "(" << t.first << "," << t.second << ")";
}
template <typename T>
ostream &operator<<(ostream &s, vector<T> t) {
  s << "{";
  for (int i = 0; i < t.size(); i++)
    s << t[i] << (i == t.size() - 1 ? "" : ",");
  return s << "}" << endl;
}
long long mpow(long long a, long long b) {
  a = a % 1000000007;
  long long w = 1;
  while (b) {
    if (b % 2) w = (w * a) % 1000000007;
    a = (a * a) % 1000000007;
    b /= 2;
  }
  return w;
}
int n, k;
long long dpold[1 << 20];
long long dpnew[1 << 20];
long long l;
int a[1 << 20];
int main() {
  ios_base::sync_with_stdio(0);
  cin >> n >> l >> k;
  for (int i = 0; i < n; i++) cin >> a[i];
  vector<pair<int, int> > v;
  for (int i = 0; i < n; i++) v.push_back(make_pair(a[i], i));
  sort((v).begin(), (v).end());
  for (int i = 0; i < n; i++) dpold[i] = 1;
  long long z = l / n;
  long long r = l % n;
  long long z1 = 1;
  long long z0 = 0;
  long long silnia = 1;
  long long silnia1 = 1;
  long long res = 0;
  long long wsp0, wsp1;
  for (int x = 1; x <= k; x++) {
    wsp0 = (z - x + 1);
    if (wsp0 < 0) wsp0 = 0;
    wsp0 %= 1000000007;
    int ind = 0;
    long long wyn = 0;
    for (int i = 0; i < n; i++) {
      if (v[i].second < r && (x - 1 <= z)) res = (res + dpold[i]) % 1000000007;
      res = (res + wsp0 * dpold[i]) % 1000000007;
    }
    for (int i = 0; i < n; i++) {
      while (ind < n && v[ind].first <= v[i].first) {
        wyn = (wyn + dpold[ind]) % 1000000007;
        ind++;
      }
      dpnew[i] = wyn;
    }
    for (int i = 0; i < n; i++) dpold[i] = dpnew[i];
  }
  cout << res;
  return 0;
}
