#include <bits/stdc++.h>
using namespace std;
pair<long long, pair<long long, long long> > extendedEuclid(long long a,
                                                            long long b) {
  long long x = 1, y = 0;
  long long xLast = 0, yLast = 1;
  long long q, r, m, n;
  while (a != 0) {
    q = b / a;
    r = b % a;
    m = xLast - q * x;
    n = yLast - q * y;
    xLast = x, yLast = y;
    x = m, y = n;
    b = a, a = r;
  }
  return make_pair(b, make_pair(xLast, yLast));
}
long long modInverse(long long a, long long m) {
  if (m == 0) return 1;
  long long temp = modInverse(a, m / 2);
  if (m % 2 == 0)
    return (temp * temp) % 1000000007;
  else
    return (((temp * temp) % 1000000007) * (a % 1000000007)) % 1000000007;
}
int main() {
  long long n, l, k;
  cin >> n >> l >> k;
  vector<long long> a(n);
  map<long long, long long> m;
  map<long long, long long> m1;
  for (long long i = 0; i < n; i++) {
    scanf("%lli", &a[i]);
    m1[a[i]] = 0;
  }
  for (long long i = 0; i < l % n; i++) {
    m1[a[i]]++;
  }
  for (long long i = 0; i < n; i++) {
    m[a[i]]++;
  }
  long long ans = 0;
  vector<vector<long long> > dp(m.size(), vector<long long>(k + 1));
  vector<vector<long long> > dp1(m.size(), vector<long long>(k + 1));
  map<long long, long long>::iterator it;
  vector<long long> count1(m.size());
  vector<long long> count2(m.size());
  long long i = 0;
  if (l / n > 0) {
    for (it = m.begin(); it != m.end(); it++) {
      dp1[i][1] = ((*it).second);
      count1[i] = (*it).second;
      count2[i] = (l / n);
      count2[i]--;
      i++;
    }
    for (i = 2; i <= k; i++) {
      long long temp = 0;
      for (long long j = 0; j < m.size(); j++) {
        if (count2[j] == 0) {
          temp = (temp + dp1[j][i - 1]) % 1000000007;
          dp1[j][i] = 0;
          continue;
        } else {
          temp = (temp + dp1[j][i - 1]) % 1000000007;
          count2[j]--;
          dp1[j][i] = (temp * count1[j]) % 1000000007;
        }
      }
    }
    i = 0;
    for (it = m.begin(); it != m.end(); it++) {
      dp[i][1] = (((*it).second) * ((l / n) % 1000000007)) % 1000000007;
      count2[i] = (l / n);
      count2[i]--;
      i++;
    }
    for (i = 2; i <= k; i++) {
      long long temp = 0;
      for (long long j = 0; j < m.size(); j++) {
        if (count2[j] == 0) {
          temp = (temp + dp[j][i - 1]) % 1000000007;
          dp[j][i] = 0;
          continue;
        } else {
          temp = (temp +
                  (dp[j][i - 1] - dp1[j][i - 1] + 1000000007) % 1000000007) %
                 1000000007;
          count2[j]--;
          dp[j][i] = (temp * count1[j]) % 1000000007;
        }
      }
    }
    for (i = 0; i < m.size(); i++) {
      for (long long j = 1; j <= k; j++) {
        ans = (ans + dp[i][j]) % 1000000007;
      }
    }
  }
  if (l % n != 0) {
    i = 0;
    for (it = m.begin(); it != m.end(); it++) {
      dp[i][1] = m1[(*it).first];
      count1[i] = (*it).second;
      count2[i] = (l / n);
      i++;
    }
    for (i = 2; i <= k; i++) {
      long long temp = 0;
      for (long long j = m.size() - 1; j >= 0; j--) {
        if (count2[j] == 0) {
          temp = (temp + dp[j][i - 1]) % 1000000007;
          dp[j][i] = 0;
          continue;
        } else {
          temp = (temp + dp[j][i - 1]) % 1000000007;
          count2[j]--;
          dp[j][i] = (count1[j] * temp) % 1000000007;
        }
      }
    }
    for (i = 0; i < m.size(); i++) {
      for (long long j = 1; j <= k; j++) {
        ans = (ans + dp[i][j]) % 1000000007;
      }
    }
  }
  cout << (ans + 1000000007) % 1000000007;
  return 0;
}
