#include<cstdio>
#include<algorithm>
#define INF (1 << 30)
#define FOR(i,a,b)\
for(int i=a; i<=b; ++i)
#define FORR(i,a,b)\
for(int i=a; i>=b; --i)
#define infile "pod.in"
#define outfile "pod.out"
#define mMax 1005
#define kMax 21
#define MOD 9901
using namespace std;
struct Matrix{
int M[kMax][kMax];
int L, C;
#define A (*this)
Matrix(int L, int C){
A.L = L;
A.C = C;
FOR(i,0,L)
FOR(j,0,C)
M[i][j] = 0;
}
Matrix operator * (const Matrix &B)const{
Matrix C(A.L, B.C);
FOR(i, 1, A.L)
FOR(j, 1, B.C)
FOR(k, 1, A.C)
C.M[i][j] = (C.M[i][j] + A.M[i][k] * B.M[k][j]) % MOD;
return C;
}
} *I;
int V[mMax];
int N, M, K, Sol;
void read(){
freopen(infile, "r", stdin);
scanf("%d %d %d", &N, &M, &K);
FOR(i,1,M)
scanf("%d", &V[i]);
fclose(stdin);
}
Matrix pow(Matrix M, int K){
if(!K)
return *I;
Matrix r = pow(M, K>>1);
r = r * r;
if(K & 1)
r = r * M;
return r;
}
void solve(){
sort(V+1, V+M+1);
/***********************************/
Matrix EXP(K,K), DP(1,K);
I = new Matrix(K,K);
FOR(i,1,K)
(*I).M[i][i] = 1;
FOR(i,1,K)
EXP.M[i+1][i] = 1, EXP.M[i][K] = 1;
DP.M[1][0] = 1;
/***********************************/
int i, iM = 1;
for(i = 1; i <= K; ++i){
if(V[iM] != i)
FORR(j, i-1, max(0, i-K))
DP.M[1][i] = (DP.M[1][i] + DP.M[1][j]) % MOD;
else{
FORR(j,K-1,1)
DP.M[1][j] = DP.M[1][j+1];
DP.M[1][K] = 0;
iM ++;
}
}
i --;
while(iM <= M){
DP = DP * pow(EXP, V[iM] - i - 1);
i = V[iM ++];
FORR(j,K-1,1)
DP.M[1][j] = DP.M[1][j+1];
DP.M[1][K] = 0;
}
DP = DP * pow(EXP, N - i);
Sol = DP.M[1][K];
}
void print(){
freopen(outfile, "w", stdout);
printf("%d\n", Sol);
fclose(stdout);
}
int main(){
read();
solve();
print();
return 0;
}