#include <bits/stdc++.h>
using namespace std;
int a[1000050], b[1000050], bt, **dp, s[1000050], c[1000050];
template <class free>
inline void read(free &);
inline int query(int);
int main() {
  int n, K;
  long long l;
  read(n), read(l), read(K);
  for (int i(1); i <= n; ++i) read(a[i]), b[i] = a[i];
  sort(b + 1, b + n + 1), bt = unique(b + 1, b + n + 1) - b - 1;
  for (int i(1); i <= n; ++i) c[i] = query(a[i]);
  dp = new int *[K + 1];
  for (int i(0), j; i <= K; ++i) dp[i] = new int[n + 1]();
  for (int i(1); i <= n; ++i) dp[1][i] = 1, ++s[c[i]];
  for (int i(1); i <= bt; ++i) s[i] += s[i - 1];
  for (int i(2), j; i <= K; ++i) {
    for (j = 1; j <= n; ++j) dp[i][j] = s[c[j]];
    memset(s, 0, 4 * (bt + 1));
    for (j = 1; j <= n; ++j) (s[c[j]] += dp[i][j]) %= 1000000007;
    for (j = 1; j <= bt; ++j) (s[j] += s[j - 1]) %= 1000000007;
  }
  int ans(0);
  for (int i(1), j; i <= K; ++i)
    for (j = 1; j <= n; ++j)
      ans = (ans +
             max(l / n + (j <= l % n) - i + 1, 0ll) % 1000000007 * dp[i][j]) %
            1000000007;
  printf("%d", ans);
  return 0;
}
inline int query(int x) {
  int l(1), mid, r(bt);
  while (l <= r) {
    mid = l + r >> 1;
    if (b[mid] < x)
      l = mid + 1;
    else
      r = mid - 1;
  }
  return l;
}
template <class free>
inline void read(free &x) {
  x ^= x;
  register char c;
  while (c = getchar(), c < '0' || c > '9')
    ;
  while (c >= '0' && c <= '9')
    x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
}
