#include <bits/stdc++.h>
using namespace std;
static const double EPS = 1e-10;
template <typename T, typename S>
vector<T>& operator<<(vector<T>& a, S b) {
  a.push_back(b);
  return a;
}
template <typename T>
void operator>>(vector<T>& a, int b) {
  while (b--)
    if (!a.empty()) a.pop_back();
}
bool isprime(int n) {
  if (n < 2) return false;
  for (int i = 2; i * i <= n; i++)
    if (n % i == 0) return false;
  return true;
}
long long b_pow(long long x, long long n) {
  return n ? b_pow(x * x, n / 2) * (n % 2 ? x : 1) : 1ll;
}
string itos(int n) {
  stringstream ss;
  ss << n;
  return ss.str();
}
template <class T>
ostream& operator<<(ostream& os, const pair<T, T>& p) {
  os << "(" << p.first << "," << p.second << ")";
  return os;
}
template <class T>
ostream& operator<<(ostream& os, const vector<T>& arr) {
  os << "{";
  for (int i = 0; i < arr.size(); i++) os << (i == 0 ? "" : ",") << arr[i];
  os << "}";
  return os;
}
int mod = 1000000007;
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }
long long mul(long long a, long long b, const long long mod) {
  return b ? (mul(a * 2, b / 2, mod) + (b & 1 ? a : 0)) % mod : 0;
}
long long bpow(long long a, long long b, const long long mod) {
  return (b ? bpow(a * a % mod, b / 2, mod) * (b & 1 ? a : 1) : 1) % mod;
}
long long inv(long long a, const long long mod) {
  return bpow(a, mod - 2, mod);
}
class mInt {
 public:
  static const long long mod = 1000000007;
  long long v;
  mInt() : v(0) {}
  mInt(long long v) : v((v % mod + mod) % mod) {}
};
mInt& operator+=(mInt& a, mInt b) { return a = a.v + b.v; }
mInt& operator-=(mInt& a, mInt b) { return a = a.v - b.v; }
mInt& operator*=(mInt& a, mInt b) { return a = a.v * b.v; }
mInt& operator/=(mInt& a, mInt b) { return a = a.v * inv(b.v, mInt::mod); }
mInt operator+(mInt a, mInt b) { return a += b; }
mInt operator-(mInt a, mInt b) { return a -= b; }
mInt operator*(mInt a, mInt b) { return a *= b; }
mInt operator/(mInt a, mInt b) { return a /= b; }
ostream& operator<<(ostream& os, const mInt& x) { return os << x.v; }
template <int N>
struct nCr {
  vector<long long> f, finv;
  long long ncr(long long n, long long r) {
    if (r > n || r < 0) return 0;
    assert(n <= N);
    return f[n] * finv[r] % mod * finv[n - r] % mod;
  }
  long long nHr(long long n, long long r) { return ncr(n + r - 1, r); }
  nCr() {
    f.resize(N + 1);
    finv.resize(N + 1);
    f[0] = 1;
    for (int i = 1; i <= N; i++) f[i] = i * f[i - 1] % mod;
    finv[N] = inv(f[N], mod);
    for (int i = N - 1; i >= 0; i--) finv[i] = finv[i + 1] * (i + 1) % mod;
  }
};
int src[1000100];
int a[1000100];
int pos[1000100];
int rpos[1000100];
int main() {
  nCr<10000> C;
  int n;
  cin >> n;
  long long l;
  cin >> l;
  long long k;
  cin >> k;
  for (int i = 0; i < n; i++) {
    scanf("%d", &a[i]);
    src[i] = a[i];
  }
  sort(a, a + n);
  for (int i = 0; i < n; i++) {
    pos[i] = i;
    if (i && a[i - 1] == a[i]) pos[i] = pos[i - 1];
  }
  vector<vector<mInt>> dp(k + 1, vector<mInt>(n));
  vector<vector<mInt>> imos(k + 1, vector<mInt>(n));
  for (int i = 0; i < n; i++) dp[1][i] = 1;
  for (int i = 2; i <= k; i++) {
    for (int j = 0; j < n; j++) imos[i][pos[j]] += dp[i - 1][j];
    mInt tot = 0;
    for (int j = 0; j < n; j++) {
      tot += imos[i][j];
      dp[i][j] = tot;
    }
  }
  long long L = l / n;
  mInt ans = 0;
  for (int i = 1; i <= k; i++) {
    for (int j = 0; j < n; j++) {
      ans += dp[i][j] * max(0ll, L - i + 1);
    }
  }
  for (int i = 0; i <= k; i++) {
    for (int j = 1; j < n; j++) {
      dp[i][j] += dp[i][j - 1];
    }
  }
  for (int i = 0; i <= min(L, k - 1); i++) {
    for (int j = 0; j < l % n; j++) {
      if (i == 0) {
        ans += 1;
      } else {
        int pos = upper_bound(a, a + n, src[j]) - a - 1;
        ans += dp[i][pos];
      }
    }
  }
  cout << ans.v << endl;
}
