import java.io.*;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Locale;
import java.util.StringTokenizer;
public class TaskB {
private final InputReader reader;
private final OutputWriter writer;
public TaskB(InputReader reader, OutputWriter writer) {
this.reader = reader;
this.writer = writer;
}
public static void main
(String[] args
) { InputReader reader
= new InputReader
(System.
in); OutputWriter writer
= new OutputWriter
(System.
out); new TaskB(reader, writer).run();
writer.writer.flush();
}
public void run() {
final int n = reader.nextInt();
long len = reader.nextLong();
int k = reader.nextInt();
int[][] D = new int[k][n];
for (int i = 0; i < n; i++) {
D[0][i] = (i < len) ? 1 : 0;
}
for (int i = 0; i < n; i++)
order[i] = i;
final int[] A = new int[n];
for (int i = 0; i < n; i++)
A[i] = reader.nextInt();
Arrays.
sort(order,
new Comparator
<Integer
>() { @Override
return Integer.
compare(A
[a
], A
[b
]); }
});
final int MOD = 1000 * 1000 * 1000 + 7;
for (int i = 1; i < k; i++) {
int sum = 0;
for (int l = 0, r = 0; l < n; l = r) {
while (r != n && A[order[l]] == A[order[r]])
r++;
for (int j = l; j < r; j++)
sum = (sum + D[i - 1][order[j]] >= MOD) ? sum + D[i - 1][order[j]] - MOD : sum + D[i - 1][order[j]];
for (int j = l; j < r; j++)
D[i][order[j]] = sum;
}
}
int ans = 0;
for (int i = 0; i < k; i++)
for (int j = 0; j < n; j++) {
if (i * n + j >= len)
continue;
int val = (int)((len / n + 1 - i - ((j >= len % n) ? 1 : 0)) % MOD);
val = (int)((((long)val) * D[i][j]) % MOD);
ans = (ans + val >= MOD) ? ans + val - MOD : ans + val;
}
writer.printf("%d\n", ans);
}
static class InputReader {
tokenizer = null;
}
while (tokenizer == null || !tokenizer.hasMoreTokens()) {
try {
}
}
return tokenizer.nextToken();
}
public int nextInt() {
}
public double nextDouble() {
return Double.
parseDouble(next
()); }
public long nextLong() {
return Long.
parseLong(next
()); }
}
static class OutputWriter {
}
}
}
}