#include <bits/stdc++.h>
#define DEBUG(x) cerr << (#x) << ": " << (x) << '\n'
using namespace std;
const int MOD = 9901;
struct Matrix {
int n;
int a[20][20];
Matrix(int n) : n(n) {
clear();
}
int* operator[](const int pos) {
return a[pos];
}
void clear() {
memset(a, 0, sizeof(a));
}
};
void mult(Matrix &a, Matrix &b, Matrix &res) {
res.clear();
int n = a.n;
for (int i = 0; i < n; ++i) {
for (int k = 0; k < n; ++k) {
for (int j = 0; j < n; ++j) {
res[i][j] += a[i][k] * b[k][j] % MOD;
if (res[i][j] >= MOD) res[i][j] -= MOD;
}
}
}
}
void toPow(Matrix b, int e, Matrix &res, Matrix &aux) {
res = b;
--e;
while (e) {
if (e & 1)
mult(res, b, aux), swap(res, aux);
mult(b, b, aux), swap(b, aux);
e >>= 1;
}
}
int main() {
freopen("pod.in", "r", stdin);
freopen("pod.out", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(0);
int n, m, k; scanf("%d%d%d", &n, &m, &k);
vector<int> v(m);
for (int i = 0; i < m; ++i) {
scanf("%d", &v[i]);
}
sort(v.begin(), v.end()); // ffs
v.erase(unique(v.begin(), v.end()), v.end());
Matrix tr(k);
for (int i = 0; i < k - 1; ++i) {
tr[i][i + 1] = 1;
}
tr[k - 1][0] = tr[k - 1][k - 1] = 1;
Matrix dp(k);
dp[k - 1][0] = 1; // dp = {{dp[-i],.., 0},..., {dp[0], 0}}
int last = 0;
Matrix aux1(k), aux2(k);
for (int i = 0; i < m; ++i) {
int e = v[i] - last;
toPow(tr, e, aux1, aux2);
mult(aux1, dp, aux2);
swap(dp, aux2);
dp[k - 1][0] = 0; // dp[v[i]] = 0
last = v[i];
}
toPow(tr, n - last, aux1, aux2);
mult(aux1, dp, aux2);
swap(dp, aux2);
cout << dp[k - 1][0] << endl;
#ifdef LOCAL_DEFINE
cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
#endif
return 0;
}