#include <bits/stdc++.h>
using namespace std;
long long int dp[2][1000010], s1, s2, ans, l;
long long int g, y;
struct node {
  long long int num, index;
} a[1000010];
long long int cmp(node x, node y) { return x.num < y.num; }
long long int n, k;
int main() {
  scanf("%lld%lld%lld", &n, &l, &k);
  for (long long int i = 0; i < n; i++) {
    scanf("%lld", &a[i].num);
    a[i].index = i;
    dp[0][i] = 1;
  }
  sort(a, a + n, cmp);
  ans = l % 1000000007;
  g = l / n;
  y = l % n;
  k = min(k, (l + n - 1) / n);
  long long int t = 0;
  for (long long int kk = 2; kk <= k; kk++) {
    t = 1 - t;
    dp[t][0] = 0;
    for (long long int ii = 0; ii < n; ii++) {
      if (a[ii].num == a[0].num) {
        dp[t][0] = (dp[t][0] + dp[1 - t][ii]) % 1000000007;
      } else
        break;
    }
    s1 = dp[t][0] % 1000000007;
    s2 = 0;
    if (a[0].index < y) {
      s2 = dp[t][0] % 1000000007;
    }
    for (long long int i = 1; i < n; i++) {
      dp[t][i] = dp[t][i - 1];
      if (a[i].num != a[i - 1].num) {
        for (long long int ii = i; ii < n; ii++) {
          if (a[i].num == a[ii].num) {
            dp[t][i] = (dp[t][i] + dp[1 - t][ii]) % 1000000007;
          } else
            break;
        }
      }
      s1 = (s1 + dp[t][i]) % 1000000007;
      if (a[i].index < y) {
        s2 = (s2 + dp[t][i]) % 1000000007;
      }
    }
    ans += ((g - kk + 1) % 1000000007) * s1 % 1000000007;
    if (ans >= 1000000007) ans -= 1000000007;
    ans += s2;
    if (ans >= 1000000007) ans -= 1000000007;
  }
  ans = (ans + 1000000007) % 1000000007;
  printf("%lld\n", ans);
  return 0;
}
