#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
#define speed                                                                  \
    ios_base::sync_with_stdio(false);                                          \
    cin.tie(0);                                                                \
    cout.tie(0);
#define ll int
#define ull unsigned long long
#define db double
#define vi vector<ll>
#define vvi vector<vector<ll> >
#define vvii vector<vector<pii> >
#define rep2(i, begin, end)                                                    \
    for (__typeof(end) i = (begin) - ((begin) > (end));                        \
         i != (end) - ((begin) > (end)); i += 1 - 2 * ((begin) > (end)))
#define rep(i, a, b) for (int i = a; i < b; i++)
#define endl "\n"
#define pii pair<ll, ll>
#define piii pair<ll, pair<ll, ll> >
#define mem(a, b) memset(a, b, sizeof a);
#define pb push_back
#define pf push_front
#define F first
#define S second
#define mp make_pair
#define all(v) v.begin(), v.end()
#define range(i, s) for (auto i : s)
#define sor(v) sort(v.begin(), v.end());
#define rev(v) reverse(v.begin(), v.end());
#define inf INFINITY
#define mc(a, b) memcpy(a, b, sizeof(b));
#define per(i, a, b) for (ll i = a - 1; i >= b; i--)
#define PI 3.14159265359

#define error(args...)                                                         \
    {                                                                          \
        string _s = #args;                                                     \
        replace(_s.begin(), _s.end(), ',', ' ');                               \
        stringstream _ss(_s);                                                  \
        istream_iterator<string> _it(_ss);                                     \
        err(_it, args);                                                        \
    }

void err(istream_iterator<string> it) {}
template <typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args)
{
    cerr << *it << " = " << a << endl;
    err(++it, args...);
}

#define deb1(a) cout << #a << "=*" << a << endl;
#define deb2(a) cout << #a << "=@" << a << endl;
#define deb3(a) cout << #a << "=#" << a << endl;
#define deb4(a, b) cout << #a << "=" << a << " and " << #b << "=" << b << endl;
#define deb5(a, b) cout << #a << "=" << a << " and " << #b << "=" << b << endl;

typedef tree<int, null_type, less<int>, rb_tree_tag,
             tree_order_statistics_node_update>
    ordered_set;
// find_by_order -> value at index
// order_of_key -> index of valu
//
//
using cd = complex<double>;

ll mod = 1000000007;
ll vis[212345] = {0};
vvi v(212345);
ll d[212345] = {0};
ll n, m, k;
ll pow(ll a, ll b, ll m)
{
    ll ans = 1;
    while (b)
    {
        if (b & 1)
            ans = (ans * a) % m;
        b /= 2;
        a = (a * a) % m;
    }
    return ans;
}

void fft(vector<cd> &a, bool inv)
{
    ll n = a.size();
    if (n == 1)
        return;
    vector<cd> a0(n / 2), a1(n / 2);
    rep(i, 0, n / 2)
    {
        a0[i] = a[2 * i];
        a1[i] = a[2 * i + 1];
    }

    fft(a0, inv);
    fft(a1, inv);

    db z = 2 * acos(-1) / n * (inv ? -1 : 1);
    cd w0(1), wn(cos(z), sin(z));
    rep(i, 0, n / 2)
    {
        a[i] = a0[i] + w0 * a1[i];
        a[i + n / 2] = a0[i] - a1[i] * w0;
        if (inv)
        {
            a[i] /= 2;
            a[i + n / 2] /= 2;
        }
        w0 *= wn;
    }
}

vector<ll> multp(vector<ll> a, vector<ll> b)
{
    vector<cd> f1(all(a)), f2(all(b));
    ll n = 1;
    while (n < a.size() + b.size())
        n *= 2;
    f1.resize(n);
    //  deb1(n);
    //  cout << "$$\n";
    //   rep(i, 0, n) cout << "f1[" << i << "]=" << f1[i] << endl;
    f2.resize(n);
    //   rep(i, 0, n) cout << "f2[" << i << "]=" << f2[i] << endl;
    fft(f1, 0);
    //    rep(i, 0, n) cout << "f1[" << i << "]=" << f1[i] << endl;
    fft(f2, 0);
    rep(i, 0, n) f1[i] *= f2[i];
    fft(f1, 1);
    //  rep(i, 0, n) cout << "f2[" << i << "]=" << f2[i] << endl;
    //  rep(i, 0, n) cout << f1[i] << "@\n";
    vector<ll> res;
    rep(i, 0, min(n, k + 1)) res.pb((long long)(f1[i].real() + 0.5) % 1009);
    //  deb1(n);
    //  rep(i, 0, n) cout << "res[" << i << "]=" << res[i] << endl;
    return res;
}
vvi a(200005);
vector<ll> work(ll l, ll r)
{
    if (l == r)
        return a[l];
    ll mid = (l + r) / 2;
    //  deb4(l, r);
    //   deb1(mid);
    return multp(work(l, mid), work(mid + 1, r));
}

int main()
{
    speed
            // ll n, m, k;
            cin
        >> n >> m >> k;
    ll c[m + 1];
    mem(c, 0);
    ll z;
    vi v1(m, 0);
    rep(i, 1, m + 1) a[i].pb(1);
    rep(i, 0, n)
    {
        cin >> z;
        c[z]++;
        a[z].pb(1);
        v1[m - 1]++;
    }
    // vi q(2, 1), q2(2, 1);
    // deb1(q[1]);
    // deb1(q2[1]);
    // vi qq = multp(q, q2);
    // rep(i, 0, 2) cout << qq[i] << "$ \n";
    cout << work(1, m)[k];
}


#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
#define speed                                                                  \
    ios_base::sync_with_stdio(false);                                          \
    cin.tie(0);                                                                \
    cout.tie(0);
#define ll long long
#define ull unsigned long long
#define db double
#define vi vector<ll>
#define vvi vector<vector<ll> >
#define vvii vector<vector<pii> >
#define rep2(i, begin, end)                                                    \
    for (__typeof(end) i = (begin) - ((begin) > (end));                        \
         i != (end) - ((begin) > (end)); i += 1 - 2 * ((begin) > (end)))
#define rep(i, a, b) for (int i = a; i < b; i++)
#define per(i, n) for (ll i = n - 1; i >= 0; i--)
#define endl "\n"
#define pii pair<ll, ll>
#define piii pair<ll, pair<ll, ll> >
#define mem(a, b) memset(a, b, sizeof a);
#define pb push_back
#define pf push_front
#define F first
#define S second
#define mp make_pair
#define all(v) v.begin(), v.end()
#define range(i, s) for (auto i : s)
#define sor(v) sort(v.begin(), v.end());
#define rev(v) reverse(v.begin(), v.end());
#define inf INFINITY
#define mc(a, b) memcpy(a, b, sizeof(b));
#define per(i, a, b) for (ll i = a - 1; i >= b; i--)
#define PI 3.14159265359

#define error(args...)                                                         \
    {                                                                          \
        string _s = #args;                                                     \
        replace(_s.begin(), _s.end(), ',', ' ');                               \
        stringstream _ss(_s);                                                  \
        istream_iterator<string> _it(_ss);                                     \
        err(_it, args);                                                        \
    }

void err(istream_iterator<string> it) {}
template <typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args)
{
    cerr << *it << " = " << a << endl;
    err(++it, args...);
}

#define deb1(a) cout << #a << "=*" << a << endl;
#define deb2(a) cout << #a << "=@" << a << endl;
#define deb3(a) cout << #a << "=#" << a << endl;
#define deb4(a, b) cout << #a << "=" << a << " and " << #b << "=" << b << endl;
#define deb5(a, b) cout << #a << "=" << a << " and " << #b << "=" << b << endl;

typedef tree<int, null_type, less<int>, rb_tree_tag,
             tree_order_statistics_node_update>
    ordered_set;
// find_by_order -> value at index
// order_of_key -> index of valu
//
//
using cd = complex<double>;

ll mod = 1000000007;
ll vis[212345] = {0};
vvi v(212345);
ll d[212345] = {0};
ll n, m, k;
ll pow(ll a, ll b, ll m)
{
    ll ans = 1;
    while (b)
    {
        if (b & 1)
            ans = (ans * a) % m;
        b /= 2;
        a = (a * a) % m;
    }
    return ans;
}

void fft(vector<cd> &a, bool inv)
{
    ll n = a.size();
    if (n == 1)
        return;
    vector<cd> a0(n / 2), a1(n / 2);
    rep(i, 0, n / 2)
    {
        a0[i] = a[2 * i];
        a1[i] = a[2 * i + 1];
    }

    fft(a0, inv);
    fft(a1, inv);

    db z = 2 * acos(-1) / n * (inv ? -1 : 1);
    cd w0(1), wn(cos(z), sin(z));
    rep(i, 0, n / 2)
    {
        a[i] = a0[i] + w0 * a1[i];
        a[i + n / 2] = a0[i] - a1[i] * w0;
        if (inv)
        {
            a[i] /= 2;
            a[i + n / 2] /= 2;
        }
        w0 *= wn;
    }
}

vector<ll> multp(vector<ll> a, vector<ll> b)
{
    vector<cd> f1(all(a)), f2(all(b));
    ll n = 1;
    while (n < a.size() + b.size())
        n *= 2;
    f1.resize(n);
    //  deb1(n);
    //  cout << "$$\n";
    //   rep(i, 0, n) cout << "f1[" << i << "]=" << f1[i] << endl;
    f2.resize(n);
    //   rep(i, 0, n) cout << "f2[" << i << "]=" << f2[i] << endl;
    fft(f1, 0);
    //    rep(i, 0, n) cout << "f1[" << i << "]=" << f1[i] << endl;
    fft(f2, 0);
    rep(i, 0, n) f1[i] *= f2[i];
    fft(f1, 1);
    //  rep(i, 0, n) cout << "f2[" << i << "]=" << f2[i] << endl;
    //  rep(i, 0, n) cout << f1[i] << "@\n";
    vector<ll> res(n);
    rep(i, 0, min(n, k + 1)) res[i] = (ll)(f1[i].real() + 0.5) % 1009;
    //  deb1(n);
    //  rep(i, 0, n) cout << "res[" << i << "]=" << res[i] << endl;
    return res;
}
vvi a(200005);
vector<ll> work(ll l, ll r)
{
    if (l == r)
        return a[l];
    ll mid = (l + r) / 2;
    //  deb4(l, r);
    //   deb1(mid);
    return multp(work(l, mid), work(mid + 1, r));
}

int main()
{
    speed
            // ll n, m, k;
            cin
        >> n >> m >> k;
    ll c[m + 1];
    mem(c, 0);
    ll z;
    vi v1(m, 0);
    rep(i, 1, m + 1) a[i].pb(1);
    rep(i, 0, n)
    {
        cin >> z;
        c[z]++;
        a[z].pb(1);
        v1[m - 1]++;
    }
    // vi q(2, 1), q2(2, 1);
    // deb1(q[1]);
    // deb1(q2[1]);
    // vi qq = multp(q, q2);
    // rep(i, 0, 2) cout << qq[i] << "$ \n";
    cout << work(1, m)[k];
}


    #include<bits/stdc++.h>
    using namespace std;
    const double pi=acos(-1);
    vector<int>a[200005];
    int n,m,k;
    struct cp{
    double x,y;
    }cur[400005];
    cp operator+(cp a,cp b){
    return(cp){a.x+b.x,a.y+b.y};
    }
    cp operator-(cp a,cp b){
    return(cp){a.x-b.x,a.y-b.y};
    }
    cp operator*(cp a,cp b){
    return(cp){a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x};
    }
    vector<cp>aa,bb;
    void fft(vector<cp>&a,int n,int fl){
    for(int i=(n>>1),j=1;j<n;j++){
    if(i<j)
    swap(a[i],a[j]);
    int k;
    for(k=(n>>1);k&i;i^=k,k>>=1);
    i^=k;
    }
    for(int m=2;m<=n;m<<=1){
    cp w=(cp){cos(2*pi*fl/m),sin(2*pi*fl/m)};
    cur[0]=(cp){1,0};
    for(int j=1;j<(m>>1);j++)
    cur[j]=cur[j-1]*w;
    for(int i=0;i<n;i+=m)
    for(int j=i;j<i+(m>>1);j++){
    cp u=a[j],v=a[j+(m>>1)]*cur[j-i];
    a[j]=u+v;
    a[j+(m>>1)]=u-v;
    }
    }
    if(fl==-1)
    for(int i=0;i<n;i++)
    a[i]=(cp){a[i].x/n,a[i].y/n};
    }
    vector<int>multi(vector<int>A,vector<int>B){
    int lena=A.size(),lenb=B.size(),len=1;
    while(len<2*max(lena,lenb))
    len<<=1;
    aa=vector<cp>(len);
    bb=vector<cp>(len);
    for(int i=0;i<lena;i++)
    aa[i]=(cp){(double)A[i],0};
    for(int i=0;i<lenb;i++)
    bb[i]=(cp){(double)B[i],0};
    fft(aa,len,1);
    fft(bb,len,1);
    for(int i=0;i<len;i++)
    aa[i]=aa[i]*bb[i];
    fft(aa,len,-1);
    A.clear();
    for(int i=0;i<min(len,k+1);i++)
    A.push_back((long long)(aa[i].x+0.5)%1009);
    return A;
    }
    vector<int>work(int l,int r){
    if(l==r)
    return a[l];
    int mid=(l+r)>>1;
    return multi(work(l,mid),work(mid+1,r));
    }
    int main(){
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=m;i++)
    a[i].push_back(1);
    for(int i=1;i<=n;i++){
    int x;
    scanf("%d",&x);
    a[x].push_back(1);
    }
    printf("%d\n",work(1,m)[k]);
    return 0;
    }


#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
#define speed                                                                  \
    ios_base::sync_with_stdio(false);                                          \
    cin.tie(0);                                                                \
    cout.tie(0);
#define ll int
#define ull unsigned long long
#define db double
#define vi vector<ll>
#define vvi vector<vector<ll> >
#define vvii vector<vector<pii> >
#define rep2(i, begin, end)                                                    \
    for (__typeof(end) i = (begin) - ((begin) > (end));                        \
         i != (end) - ((begin) > (end)); i += 1 - 2 * ((begin) > (end)))
#define rep(i, a, b) for (int i = a; i < b; i++)
#define endl "\n"
#define pii pair<ll, ll>
#define piii pair<ll, pair<ll, ll> >
#define mem(a, b) memset(a, b, sizeof a);
#define pb push_back
#define pf push_front
#define F first
#define S second
#define mp make_pair
#define all(v) v.begin(), v.end()
#define range(i, s) for (auto i : s)
#define sor(v) sort(v.begin(), v.end());
#define rev(v) reverse(v.begin(), v.end());
#define inf INFINITY
#define mc(a, b) memcpy(a, b, sizeof(b));
#define per(i, a, b) for (ll i = a - 1; i >= b; i--)
#define PI 3.14159265359

#define error(args...)                                                         \
    {                                                                          \
        string _s = #args;                                                     \
        replace(_s.begin(), _s.end(), ',', ' ');                               \
        stringstream _ss(_s);                                                  \
        istream_iterator<string> _it(_ss);                                     \
        err(_it, args);                                                        \
    }

void err(istream_iterator<string> it) {}
template <typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args)
{
    cerr << *it << " = " << a << endl;
    err(++it, args...);
}

#define deb1(a) cout << #a << "=*" << a << endl;
#define deb2(a) cout << #a << "=@" << a << endl;
#define deb3(a) cout << #a << "=#" << a << endl;
#define deb4(a, b) cout << #a << "=" << a << " and " << #b << "=" << b << endl;
#define deb5(a, b) cout << #a << "=" << a << " and " << #b << "=" << b << endl;

typedef tree<int, null_type, less<int>, rb_tree_tag,
             tree_order_statistics_node_update>
    ordered_set;
// find_by_order -> value at index
// order_of_key -> index of valu
//
//
using cd = complex<double>;

ll mod = 1000000007;
ll vis[212345] = {0};
vvi v(212345);
ll d[212345] = {0};
ll n, m, k;
ll pow(ll a, ll b, ll m)
{
    ll ans = 1;
    while (b)
    {
        if (b & 1)
            ans = (ans * a) % m;
        b /= 2;
        a = (a * a) % m;
    }
    return ans;
}

void fft(vector<cd> &a, bool inv)
{
    ll n = a.size();
    if (n == 1)
        return;
    vector<cd> a0(n / 2), a1(n / 2);
    rep(i, 0, n / 2)
    {
        a0[i] = a[2 * i];
        a1[i] = a[2 * i + 1];
    }

    fft(a0, inv);
    fft(a1, inv);

    db z = 2 * acos(-1) / n * (inv ? -1 : 1);
    cd w0(1), wn(cos(z), sin(z));
    rep(i, 0, n / 2)
    {
        a[i] = a0[i] + w0 * a1[i];
        a[i + n / 2] = a0[i] - a1[i] * w0;
        if (inv)
        {
            a[i] /= 2;
            a[i + n / 2] /= 2;
        }
        w0 *= wn;
    }
}

vector<ll> multp(vector<ll> a, vector<ll> b)
{
    vector<cd> f1(all(a)), f2(all(b));
    ll n = 1;
    while (n < a.size() + b.size())
        n *= 2;
    f1.resize(n);
    //  deb1(n);
    //  cout << "$$\n";
    //   rep(i, 0, n) cout << "f1[" << i << "]=" << f1[i] << endl;
    f2.resize(n);
    //   rep(i, 0, n) cout << "f2[" << i << "]=" << f2[i] << endl;
    fft(f1, 0);
    //    rep(i, 0, n) cout << "f1[" << i << "]=" << f1[i] << endl;
    fft(f2, 0);
    rep(i, 0, n) f1[i] *= f2[i];
    fft(f1, 1);
    //  rep(i, 0, n) cout << "f2[" << i << "]=" << f2[i] << endl;
    //  rep(i, 0, n) cout << f1[i] << "@\n";
    vector<ll> res(n);
    rep(i, 0, min(n, k + 1)) res[i] = (long long)(f1[i].real() + 0.5) % 1009;
    //  deb1(n);
    //  rep(i, 0, n) cout << "res[" << i << "]=" << res[i] << endl;
    return res;
}
vvi a(200005);
vector<ll> work(ll l, ll r)
{
    if (l == r)
        return a[l];
    ll mid = (l + r) / 2;
    //  deb4(l, r);
    //   deb1(mid);
    return multp(work(l, mid), work(mid + 1, r));
}

int main()
{
    speed
            // ll n, m, k;
            cin
        >> n >> m >> k;
    ll c[m + 1];
    mem(c, 0);
    ll z;
    vi v1(m, 0);
    rep(i, 1, m + 1) a[i].pb(1);
    rep(i, 0, n)
    {
        cin >> z;
        c[z]++;
        a[z].pb(1);
        v1[m - 1]++;
    }
    // vi q(2, 1), q2(2, 1);
    // deb1(q[1]);
    // deb1(q2[1]);
    // vi qq = multp(q, q2);
    // rep(i, 0, 2) cout << qq[i] << "$ \n";
    cout << work(1, m)[k];
}


#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
#define speed                                                                  \
    ios_base::sync_with_stdio(false);                                          \
    cin.tie(0);                                                                \
    cout.tie(0);
#define ll long long
#define ull unsigned long long
#define db double
#define vi vector<ll>
#define vvi vector<vector<ll> >
#define vvii vector<vector<pii> >
#define rep2(i, begin, end)                                                    \
    for (__typeof(end) i = (begin) - ((begin) > (end));                        \
         i != (end) - ((begin) > (end)); i += 1 - 2 * ((begin) > (end)))
#define rep(i, a, b) for (int i = a; i < b; i++)
#define per(i, n) for (ll i = n - 1; i >= 0; i--)
#define endl "\n"
#define pii pair<ll, ll>
#define piii pair<ll, pair<ll, ll> >
#define mem(a, b) memset(a, b, sizeof a);
#define pb push_back
#define pf push_front
#define F first
#define S second
#define mp make_pair
#define all(v) v.begin(), v.end()
#define range(i, s) for (auto i : s)
#define sor(v) sort(v.begin(), v.end());
#define rev(v) reverse(v.begin(), v.end());
#define inf INFINITY
#define mc(a, b) memcpy(a, b, sizeof(b));
#define per(i, a, b) for (ll i = a - 1; i >= b; i--)
#define PI 3.14159265359

#define error(args...)                                                         \
    {                                                                          \
        string _s = #args;                                                     \
        replace(_s.begin(), _s.end(), ',', ' ');                               \
        stringstream _ss(_s);                                                  \
        istream_iterator<string> _it(_ss);                                     \
        err(_it, args);                                                        \
    }

void err(istream_iterator<string> it) {}
template <typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args)
{
    cerr << *it << " = " << a << endl;
    err(++it, args...);
}

#define deb1(a) cout << #a << "=*" << a << endl;
#define deb2(a) cout << #a << "=@" << a << endl;
#define deb3(a) cout << #a << "=#" << a << endl;
#define deb4(a, b) cout << #a << "=" << a << " and " << #b << "=" << b << endl;
#define deb5(a, b) cout << #a << "=" << a << " and " << #b << "=" << b << endl;

typedef tree<int, null_type, less<int>, rb_tree_tag,
             tree_order_statistics_node_update>
    ordered_set;
// find_by_order -> value at index
// order_of_key -> index of valu
//
//
using cd = complex<double>;

ll mod = 1000000007;
ll vis[212345] = {0};
vvi v(212345);
ll d[212345] = {0};

ll pow(ll a, ll b, ll m)
{
    ll ans = 1;
    while (b)
    {
        if (b & 1)
            ans = (ans * a) % m;
        b /= 2;
        a = (a * a) % m;
    }
    return ans;
}

void fft(vector<cd> &a, bool inv)
{
    ll n = a.size();
    if (n == 1)
        return;
    vector<cd> a0(n / 2), a1(n / 2);
    rep(i, 0, n / 2)
    {
        a0[i] = a[2 * i];
        a1[i] = a[2 * i + 1];
    }

    fft(a0, inv);
    fft(a1, inv);

    db z = 2 * acos(-1) / n * (inv ? -1 : 1);
    cd w0(1), wn(cos(z), sin(z));
    rep(i, 0, n / 2)
    {
        a[i] = a0[i] + w0 * a1[i];
        a[i + n / 2] = a0[i] - a1[i] * w0;
        if (inv)
        {
            a[i] /= 2;
            a[i + n / 2] /= 2;
        }
        w0 *= wn;
    }
}

vector<ll> multp(vector<ll> a, vector<ll> b)
{
    vector<cd> f1(all(a)), f2(all(b));
    ll n = 1;
    while (n < a.size() + b.size())
        n *= 2;
    f1.resize(n);
    //  deb1(n);
    //  cout << "$$\n";
    //   rep(i, 0, n) cout << "f1[" << i << "]=" << f1[i] << endl;
    f2.resize(n);
    //   rep(i, 0, n) cout << "f2[" << i << "]=" << f2[i] << endl;
    fft(f1, 0);
    //    rep(i, 0, n) cout << "f1[" << i << "]=" << f1[i] << endl;
    fft(f2, 0);
    rep(i, 0, n) f1[i] *= f2[i];
    fft(f1, 1);
    //  rep(i, 0, n) cout << "f2[" << i << "]=" << f2[i] << endl;
    //  rep(i, 0, n) cout << f1[i] << "@\n";
    vector<ll> res(n);
    rep(i, 0, n) res[i] = (ll)(f1[i].real() + 0.5) % 1009;
    //  deb1(n);
    //  rep(i, 0, n) cout << "res[" << i << "]=" << res[i] << endl;
    return res;
}
vvi a(200005);
vector<ll> work(ll l, ll r)
{
    if (l == r)
        return a[l];
    ll mid = (l + r) / 2;
    //  deb4(l, r);
    //   deb1(mid);
    return multp(work(l, mid), work(mid + 1, r));
}

int main()
{
    speed ll n, m, k;
    cin >> n >> m >> k;
    ll c[m + 1];
    mem(c, 0);
    ll z;
    vi v1(m, 0);
    rep(i, 1, m + 1) a[i].pb(1);
    rep(i, 0, n)
    {
        cin >> z;
        c[z]++;
        a[z].pb(1);
        v1[m - 1]++;
    }
    // vi q(2, 1), q2(2, 1);
    // deb1(q[1]);
    // deb1(q2[1]);
    // vi qq = multp(q, q2);
    // rep(i, 0, 2) cout << qq[i] << "$ \n";
    cout << work(1, m)[k];
}


#include <iostream>
#include <vector>
#include <queue>
#include <complex>
using namespace std;

#define int long
#define ld double
typedef pair <int, int> pii;
using cd = complex<ld>;

const ld PI = acos(-1.0L);

void fft(vector <cd> &a, int invert = 0) {
    int n = a.size();

    for (int i = 1, j = 0; i < n; i++) {
        int bit = n >> 1;
        for (; j & bit; bit >>= 1)
            j ^= bit;
        j ^= bit;

        if (i < j)
            swap(a[i], a[j]);
    }

    for (int len = 2; len <= n; len <<= 1) {
        ld angle = 2.0L * PI / len * (invert? -1 : 1);
        cd w(cos(angle), sin(angle));

        for (int i = 0; i < n; i += len) {
            cd cur(1.0L);
            for (int j = 0; (j << 1) < len; j++) {
                cd u = a[i+j], v = a[i+j+len/2]*cur;

                a[i+j]       = u + v;
                a[i+j+len/2] = u - v;
                cur *= w;
            }
        }
    }

    if (invert) for (cd &e : a) e /= n;
}

void multiply(vector <cd> &a, vector <cd> &b) {
    int n = a.size() + b.size() - 1;
    int log_n = 0;
    while (n > (1 << log_n)) log_n++;
    n = 1 << log_n;

    a.resize(n); b.resize(n);
    fft(a);      fft(b);

    for (int i = 0; i < n; i++)
        a[i] *= b[i];

    fft(a, 1);
    for (int i = 0; i < n; i++)
        a[i] = ((int) round(a[i].real())) % 1009ll;
}

signed main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    int n, m, k; cin >> n >> m >> k;
    vector <cd> *util = new vector <cd> [m];
    for (int i = 0; i < m; i++)
        util[i].push_back(1.0L);
    for (int i = 0; i < n; i++) {
        int x; cin >> x; x--;
        util[x].push_back(1.0L);
    }

    priority_queue <pii> Q;
    for (int i = 0; i < m; i++)
        Q.push(pii(-util[i].size(), i));

    while (Q.size() > 1) {
        pii u = Q.top(); Q.pop();
        pii v = Q.top(); Q.pop();
        multiply(util[u.second], util[v.second]);
        Q.push(pii(-util[u.second].size(), u.second));

        util[v.second].clear();
    }

    int fin = Q.top().second;
    cout << util[fin][k].real() << endl;
    return 0;
}


#include <iostream>
#include <vector>
#include <queue>
#include <complex>
using namespace std;

//#define int long
#define ld long double
typedef pair <int, int> pii;
using cd = complex<ld>;

const ld PI = acos(-1.0L);

void fft(vector <cd> &a, int invert = 0) {
    int n = a.size();

    for (int i = 1, j = 0; i < n; i++) {
        int bit = n >> 1;
        for (; j & bit; bit >>= 1)
            j ^= bit;
        j ^= bit;

        if (i < j)
            swap(a[i], a[j]);
    }

    for (int len = 2; len <= n; len <<= 1) {
        ld angle = 2.0L * PI / len * (invert? -1ll : 1ll);
        cd w(cos(angle), sin(angle));

        for (int i = 0; i < n; i += len) {
            cd cur(1.0L);
            for (int j = 0; (j << 1) < len; j++) {
                cd u = a[i+j], v = a[i+j+len/2]*cur;

                a[i+j]       = u + v;
                a[i+j+len/2] = u - v;
                cur *= w;
            }
        }
    }

    if (invert) for (cd &e : a) e /= n;
}

void multiply(vector <cd> &a, vector <cd> &b) {
    int n = a.size() + b.size() - 1;
    int log_n = 0;
    while (n > (1 << log_n)) log_n++;
    n = 1 << log_n;

    a.resize(n); b.resize(n);
    fft(a);      fft(b);

    for (int i = 0; i < n; i++)
        a[i] *= b[i];

    fft(a, 1);
    for (int i = 0; i < n; i++)
        a[i] = ((long long) round(a[i].real())) % 1009ll;
}

signed main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    int n, m, k; cin >> n >> m >> k;
    vector <cd> *util = new vector <cd> [m];
    for (int i = 0; i < m; i++)
        util[i].push_back(1.0L);
    for (int i = 0; i < n; i++) {
        int x; cin >> x; x--;
        util[x].push_back(1.0L);
    }

    priority_queue <pii> Q;
    for (int i = 0; i < m; i++)
        Q.push(pii(-util[i].size(), i));

    while (Q.size() > 1) {
        pii u = Q.top(); Q.pop();
        pii v = Q.top(); Q.pop();
        multiply(util[u.second], util[v.second]);
        Q.push(pii(-util[u.second].size(), u.second));

        util[v.second].clear();
    }

    int fin = Q.top().second;
    cout << util[fin][k].real() << endl;
    return 0;
}


#include <iostream>
#include <vector>
#include <queue>
#include <complex>
using namespace std;

//#define int long
#define ld double
typedef pair <int, int> pii;
using cd = complex<ld>;

const ld PI = acos(-1.0L);

void fft(vector <cd> &a, int invert = 0) {
    int n = a.size();

    for (int i = 1, j = 0; i < n; i++) {
        int bit = n >> 1;
        for (; j & bit; bit >>= 1)
            j ^= bit;
        j ^= bit;

        if (i < j)
            swap(a[i], a[j]);
    }

    for (int len = 2; len <= n; len <<= 1) {
        ld angle = 2.0 * PI / len * (invert? -1 : 1);
        cd w(cos(angle), sin(angle));

        for (int i = 0; i < n; i += len) {
            cd cur(1.0);
            for (int j = 0; (j << 1) < len; j++) {
                cd u = a[i+j], v = a[i+j+len/2]*cur;

                a[i+j]       = u + v;
                a[i+j+len/2] = u - v;
                cur *= w;
            }
        }
    }

    if (invert) for (cd &e : a) e /= n;
}

void multiply(vector <cd> &a, vector <cd> &b) {
    int n = a.size() + b.size() - 1;
    int log_n = 0;
    while (n > (1 << log_n)) log_n++;
    n = 1 << log_n;

    a.resize(n); b.resize(n);
    fft(a);      fft(b);

    for (int i = 0; i < n; i++)
        a[i] *= b[i];

    fft(a, 1);
    for (int i = 0; i < n; i++)
        a[i] = ((long long) round(a[i].real() + 1e-6)) % 1009ll;
}

signed main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    int n, m, k; cin >> n >> m >> k;
    vector <cd> *util = new vector <cd> [m];
    for (int i = 0; i < m; i++)
        util[i].push_back(1.0);
    for (int i = 0; i < n; i++) {
        int x; cin >> x; x--;
        util[x].push_back(1.0);
    }

    priority_queue <pii> Q;
    for (int i = 0; i < m; i++)
        Q.push(pii(-util[i].size(), i));

    while (Q.size() > 1) {
        pii u = Q.top(); Q.pop();
        pii v = Q.top(); Q.pop();
        multiply(util[u.second], util[v.second]);
        Q.push(pii(-util[u.second].size(), u.second));

        util[v.second].clear();
    }

    int fin = Q.top().second;
    cout << util[fin][k].real() << endl;
    return 0;
}


#include <bits/stdc++.h>
using namespace std;

#define int long long
#define ld long double
typedef pair <int, int> pii;
using cd = complex<ld>;

const ld PI = acos(-1.0L);

void fft(vector <cd> &a, int invert = 0) {
    int n = a.size();

    for (int i = 1, j = 0; i < n; i++) {
        int bit = n >> 1;
        for (; j & bit; bit >>= 1)
            j ^= bit;
        j ^= bit;

        if (i < j)
            swap(a[i], a[j]);
    }

    for (int len = 2; len <= n; len <<= 1) {
        ld angle = 2.0L * PI / len * (invert? -1 : 1);
        cd w(cos(angle), sin(angle));

        for (int i = 0; i < n; i += len) {
            cd cur(1.0L);
            for (int j = 0; (j << 1) < len; j++) {
                cd u = a[i+j], v = a[i+j+len/2]*cur;

                a[i+j]       = u + v;
                a[i+j+len/2] = u - v;
                cur *= w;
            }
        }
    }

    if (invert) for (cd &e : a) e /= n;
}

void multiply(vector <cd> &a, vector <cd> &b) {
    int n = a.size() + b.size() - 1;
    int log_n = 0;
    while (n > (1 << log_n)) log_n++;
    n = 1 << log_n;

    a.resize(n); b.resize(n);
    fft(a);      fft(b);

    for (int i = 0; i < n; i++)
        a[i] *= b[i];

    fft(a, 1);
    for (int i = 0; i < n; i++)
        a[i] = ((int) round(a[i].real())) % 1009ll;
}

signed main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    int n, m, k; cin >> n >> m >> k;
    vector <cd> *util = new vector <cd> [m];
    for (int i = 0; i < m; i++)
        util[i].push_back(1.0L);
    for (int i = 0; i < n; i++) {
        int x; cin >> x; x--;
        util[x].push_back(1.0L);
    }

    priority_queue <pii> Q;
    for (int i = 0; i < m; i++)
        Q.push(pii(-util[i].size(), i));

    while (Q.size() > 1) {
        pii u = Q.top(); Q.pop();
        pii v = Q.top(); Q.pop();
        multiply(util[u.second], util[v.second]);
        Q.push(pii(-util[u.second].size(), u.second));

        util[v.second].clear();
    }

    int fin = Q.top().second;
    cout << util[fin][k].real() << endl;
    return 0;
}


#include <iostream>
#include <vector>
#include <queue>
#include <complex>
using namespace std;

//#define int long
#define ld double
typedef pair <int, int> pii;
using cd = complex<ld>;

const ld PI = acos(-1.0L);

void fft(vector <cd> &a, int invert = 0) {
    int n = a.size();

    for (int i = 1, j = 0; i < n; i++) {
        int bit = n >> 1;
        for (; j & bit; bit >>= 1)
            j ^= bit;
        j ^= bit;

        if (i < j)
            swap(a[i], a[j]);
    }

    for (int len = 2; len <= n; len <<= 1) {
        ld angle = 2.0L * PI / len * (invert? -1ll : 1ll);
        complex<long double> w(cos(angle), sin(angle));

        for (int i = 0; i < n; i += len) {
            complex<long double> cur(1.0L);
            for (int j = 0; (j << 1) < len; j++) {
                cd u = a[i+j], v = cur*a[i+j+len/2];

                a[i+j]       = u + v;
                a[i+j+len/2] = u - v;
                cur *= w;
            }
        }
    }

    if (invert) for (cd &e : a) e /= n;
}

void multiply(vector <cd> &a, vector <cd> &b) {
    int n = a.size() + b.size() - 1;
    int log_n = 0;
    while (n > (1 << log_n)) log_n++;
    n = 1 << log_n;

    a.resize(n); b.resize(n);
    fft(a);      fft(b);

    for (int i = 0; i < n; i++)
        a[i] *= b[i];

    fft(a, 1);
    for (int i = 0; i < n; i++)
        a[i] = ((long long) round(a[i].real())) % 1009ll;
}

signed main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    int n, m, k; cin >> n >> m >> k;
    vector <cd> *util = new vector <cd> [m];
    for (int i = 0; i < m; i++)
        util[i].push_back(1.0L);
    for (int i = 0; i < n; i++) {
        int x; cin >> x; x--;
        util[x].push_back(1.0L);
    }

    priority_queue <pii> Q;
    for (int i = 0; i < m; i++)
        Q.push(pii(-util[i].size(), i));

    while (Q.size() > 1) {
        pii u = Q.top(); Q.pop();
        pii v = Q.top(); Q.pop();
        multiply(util[u.second], util[v.second]);
        Q.push(pii(-util[u.second].size(), u.second));

        util[v.second].clear();
    }

    int fin = Q.top().second;
    cout << util[fin][k].real() << endl;
    return 0;
}


#include <bits/stdc++.h>
using namespace std;

const int P = 1009;

int C[P][P];

int choose(int n, int k) {
	if (k < 0 || k > n) return 0;
	return C[n % P][k % P] * C[n / P][k / P] % P;
}

const int MAXN = 1<<19;

namespace FFT {

	const int MAXN = 1<<19;
	typedef long double DB;
	typedef long long LL;

	struct CP {
		DB x, y;
		CP(DB x=0, DB y=0) : x(x), y(y) {}
		CP operator+(const CP &rhs) const {
			return CP(x+rhs.x, y+rhs.y);
		}
		void operator+=(const CP &rhs) {
			x += rhs.x, y += rhs.y;
		}
		CP operator-(const CP &rhs) const {
			return CP(x-rhs.x, y-rhs.y);
		}
		CP operator*(const CP &rhs) const {
			return CP(x*rhs.x-y*rhs.y, x*rhs.y+y*rhs.x);
		}
		CP operator!() const {
			return (CP) {
				x, -y
			};
		}
		void operator*=(const CP &rhs) {
			DB tx = x*rhs.x-y*rhs.y, ty = x*rhs.y+y*rhs.x;
			x = tx, y = ty;
		}
	} f[MAXN], g[MAXN], h[MAXN], p_w[MAXN+1];

	int bit_inv[MAXN];

	void init() {
		DB alpha = acos(-1)/MAXN*2;
		for (int i = 0; i <= MAXN; i++) p_w[i] = CP(cos(alpha*i), sin(alpha*i));
		for (int i = 0, j = 1; j < MAXN; j++) {
			for (int k = MAXN >> 1; (i ^= k) < k; k >>= 1);
			bit_inv[j] = i;
		}
	}

	void FFT(CP *A, int N, int D = 1) {
		for (int j = 1, i, d = __builtin_ctz(MAXN/N); j < N-1; j++) if ((i = (bit_inv[j] >> d)) < j) swap(A[i], A[j]);
		for (int n = 1, m = MAXN/2*D; n < N; m /= 2, n <<= 1) {
			for (int i = 0; i < N; i += n<<1) {
				CP *w = (D == 1 ? p_w : p_w + MAXN), *a = A+i, *b = A+i+n;
				for (int j = 0; j < n; j++, a++, b++, w += m) {
					CP x = *w **b;
					*b = *a - x;
					*a += x;
				}
			}
		}
		if (D != 1) for (int i = 0; i < N; i++) A[i].x /= N, A[i].y /= N;
	}

	void conv(int *A, int *B, int *C, int N, int MOD) {
		if (N <= 64) {
			static int temp[64];
			memset(temp, 0, sizeof(int)*N);
			for (int i = 0; i < N; i++) {
				for (int j = 0; j < N-i; j++) temp[i+j] = (temp[i+j] + 1LL * A[i] * B[j]) % MOD;
				for (int j = N-i; j < N; j++) temp[i+j-N] = (temp[i+j-N] + 1LL * A[i] * B[j]) % MOD;
			}
			memcpy(C, temp, sizeof(int)*N);
			return;
		}
		for (int i = 0; i < N; i++) f[i] = CP(A[i], 0);
		FFT(f, N);
		for (int i = 0; i < N; i++) g[i] = CP(B[i], 0);
		FFT(g, N);
		for (int i = 0; i < N; i++) h[i] = f[i] * g[i];
		FFT(h, N, -1);
		for (int i = 0; i < N; i++) C[i] = int(h[i].x + 0.5) % MOD;
	}
};

int a[MAXN], b[MAXN], c[MAXN];

int solve(int st, int en, int *a) {
	int deg = 0;
	for (int i = st; i <= en; i++) deg += c[i] * i;
	int sum = 0;
	int flg = 0;
	for (int i = st; i <= en; i++) if (c[i]) flg++;
	if (flg == 0) {
		a[0] = 1;
		return 0;
	}
	if (flg == 1) {
		for (int i = st; i <= en; i++) {
			if (c[i]) {
				for (int j = 0; j <= i * c[i]; j++) a[j] = 0;
				for (int j = 0; j <= c[i]; j++) {
					if (j & 1) a[j * i] = P - choose(c[i], j);
					else a[j * i] = choose(c[i], j);
				}
				return deg;
			}
		}
	}
	int n = 1 << (32 - __builtin_clz(deg));
	int mid = st;
	sum = c[st] * st;
	for (int i = st + 1; i <= en; i++) {
		if (sum + c[i] * i > deg / 2) {
			mid = i - 1;
			break;
		}
		sum += c[i] * i;
	}
	int l = solve(st, mid, a);
	int *b = new int[n];
	int r = solve(mid+1, en, b);
	for (int i = l+1; i < n; i++) a[i] = 0;
	for (int i = r+1; i < n; i++) b[i] = 0;
	FFT::conv(a, b, a, n, P);
	delete b;
	return deg;
	assert(0);
}

int main() {
	FFT::init();
	for (int i = 0; i < P; i++) {
		C[i][0] = C[i][i] = 1;
		for (int j = 1; j < i; j++) C[i][j] = (C[i-1][j] + C[i-1][j-1]) % P;
	}
	int n, m, k; scanf("%d%d%d", &n, &m, &k);
	for (int i = 1; i <= n; i++) scanf("%d", &a[i]), b[a[i]]++;
	for (int i = 1; i <= m; i++) c[b[i] + 1]++;
	int deg = solve(1, n + 1, a);
	for (int i = 0; i <= deg; i++) b[i] = choose(m + i - 1, i);
	int ans = 0;
	for (int i = 0; i <= deg && i <= k; i++) ans = (ans + b[i] * a[k - i]) % P;
	cout << ans << endl;
	return 0;
}


#include <bits/stdc++.h>
using namespace std;

const int P = 1009;

int C[P][P];

int choose(int n, int k) {
	if (k < 0 || k > n) return 0;
	return C[n % P][k % P] * C[n / P][k / P] % P;
}

const int MAXN = 1<<19;

namespace FFT {

	const int MAXN = 1<<19;
	typedef long double DB;
	typedef long long LL;

	struct CP {
		DB x, y;
		CP(DB x=0, DB y=0) : x(x), y(y) {}
		CP operator+(const CP &rhs) const {
			return CP(x+rhs.x, y+rhs.y);
		}
		void operator+=(const CP &rhs) {
			x += rhs.x, y += rhs.y;
		}
		CP operator-(const CP &rhs) const {
			return CP(x-rhs.x, y-rhs.y);
		}
		CP operator*(const CP &rhs) const {
			return CP(x*rhs.x-y*rhs.y, x*rhs.y+y*rhs.x);
		}
		CP operator!() const {
			return (CP) {
				x, -y
			};
		}
		void operator*=(const CP &rhs) {
			DB tx = x*rhs.x-y*rhs.y, ty = x*rhs.y+y*rhs.x;
			x = tx, y = ty;
		}
	} f[MAXN], g[MAXN], h[MAXN], p_w[MAXN+1];

	int bit_inv[MAXN];

	void init() {
		DB alpha = acos(-1)/MAXN*2;
		for (int i = 0; i <= MAXN; i++) p_w[i] = CP(cos(alpha*i), sin(alpha*i));
		for (int i = 0, j = 1; j < MAXN; j++) {
			for (int k = MAXN >> 1; (i ^= k) < k; k >>= 1);
			bit_inv[j] = i;
		}
	}

	void FFT(CP *A, int N, int D = 1) {
		for (int j = 1, i, d = __builtin_ctz(MAXN/N); j < N-1; j++) if ((i = (bit_inv[j] >> d)) < j) swap(A[i], A[j]);
		for (int n = 1, m = MAXN/2*D; n < N; m /= 2, n <<= 1) {
			for (int i = 0; i < N; i += n<<1) {
				CP *w = (D == 1 ? p_w : p_w + MAXN), *a = A+i, *b = A+i+n;
				for (int j = 0; j < n; j++, a++, b++, w += m) {
					CP x = *w **b;
					*b = *a - x;
					*a += x;
				}
			}
		}
		if (D != 1) for (int i = 0; i < N; i++) A[i].x /= N, A[i].y /= N;
	}

	void conv(int *A, int *B, int *C, int N, int MOD) {
		if (N <= 64) {
			static int temp[64];
			memset(temp, 0, sizeof(int)*N);
			for (int i = 0; i < N; i++) {
				for (int j = 0; j < N-i; j++) temp[i+j] = (temp[i+j] + 1LL * A[i] * B[j]) % MOD;
				for (int j = N-i; j < N; j++) temp[i+j-N] = (temp[i+j-N] + 1LL * A[i] * B[j]) % MOD;
			}
			memcpy(C, temp, sizeof(int)*N);
			return;
		}
		for (int i = 0; i < N; i++) f[i] = CP(A[i], 0);
		FFT(f, N);
		for (int i = 0; i < N; i++) g[i] = CP(B[i], 0);
		FFT(g, N);
		for (int i = 0; i < N; i++) h[i] = f[i] * g[i];
		FFT(h, N, -1);
		for (int i = 0; i < N; i++) C[i] = LL(h[i].x + 0.5) % MOD;
	}
};

int a[MAXN], b[MAXN], c[MAXN];

int solve(int st, int en, int *a) {
	int deg = 0;
	for (int i = st; i <= en; i++) deg += c[i] * i;
	int sum = 0;
	int flg = 0;
	for (int i = st; i <= en; i++) if (c[i]) flg++;
	if (flg == 0) {
		a[0] = 1;
		return 0;
	}
	if (flg == 1) {
		for (int i = st; i <= en; i++) {
			if (c[i]) {
				for (int j = 0; j <= i * c[i]; j++) a[j] = 0;
				for (int j = 0; j <= c[i]; j++) {
					if (j & 1) a[j * i] = P - choose(c[i], j);
					else a[j * i] = choose(c[i], j);
				}
				return deg;
			}
		}
	}
	int n = 1 << (32 - __builtin_clz(deg));
	int mid = st;
	sum = c[st] * st;
	for (int i = st + 1; i <= en; i++) {
		if (sum + c[i] * i > deg / 2) {
			mid = i - 1;
			break;
		}
		sum += c[i] * i;
	}
	int l = solve(st, mid, a);
	int *b = new int[n];
	int r = solve(mid+1, en, b);
	for (int i = l+1; i < n; i++) a[i] = 0;
	for (int i = r+1; i < n; i++) b[i] = 0;
	FFT::conv(a, b, a, n, P);
	delete b;
	return deg;
	assert(0);
}

int main() {
	FFT::init();
	for (int i = 0; i < P; i++) {
		C[i][0] = C[i][i] = 1;
		for (int j = 1; j < i; j++) C[i][j] = (C[i-1][j] + C[i-1][j-1]) % P;
	}
	int n, m, k; scanf("%d%d%d", &n, &m, &k);
	for (int i = 1; i <= n; i++) scanf("%d", &a[i]), b[a[i]]++;
	for (int i = 1; i <= m; i++) c[b[i] + 1]++;
	int deg = solve(1, n + 1, a);
	for (int i = 0; i <= deg; i++) b[i] = choose(m + i - 1, i);
	int ans = 0;
	for (int i = 0; i <= deg && i <= k; i++) ans = (ans + b[i] * a[k - i]) % P;
	cout << ans << endl;
	return 0;
}


#include <bits/stdc++.h>
using namespace std;

const int P = 1009;

int C[P][P];

int choose(int n, int k) {
	if (k < 0 || k > n) return 0;
	return C[n % P][k % P] * C[n / P][k / P] % P;
}

const int MAXN = 1<<19;

namespace FFT {

	const int MAXN = 1<<19;
	typedef long double DB;
	typedef long long LL;

	struct CP {
		DB x, y;
		CP(DB x=0, DB y=0) : x(x), y(y) {}
		CP operator+(const CP &rhs) const {
			return CP(x+rhs.x, y+rhs.y);
		}
		void operator+=(const CP &rhs) {
			x += rhs.x, y += rhs.y;
		}
		CP operator-(const CP &rhs) const {
			return CP(x-rhs.x, y-rhs.y);
		}
		CP operator*(const CP &rhs) const {
			return CP(x*rhs.x-y*rhs.y, x*rhs.y+y*rhs.x);
		}
		CP operator!() const {
			return (CP) {
				x, -y
			};
		}
		void operator*=(const CP &rhs) {
			DB tx = x*rhs.x-y*rhs.y, ty = x*rhs.y+y*rhs.x;
			x = tx, y = ty;
		}
	} f[MAXN], g[MAXN], h[MAXN], p_w[MAXN+1];

	int bit_inv[MAXN];

	void init() {
		DB alpha = acos(-1)/MAXN*2;
		for (int i = 0; i <= MAXN; i++) p_w[i] = CP(cos(alpha*i), sin(alpha*i));
		for (int i = 0, j = 1; j < MAXN; j++) {
			for (int k = MAXN >> 1; (i ^= k) < k; k >>= 1);
			bit_inv[j] = i;
		}
	}

	void FFT(CP *A, int N, int D = 1) {
		for (int j = 1, i, d = __builtin_ctz(MAXN/N); j < N-1; j++) if ((i = (bit_inv[j] >> d)) < j) swap(A[i], A[j]);
		for (int n = 1, m = MAXN/2*D; n < N; m /= 2, n <<= 1) {
			for (int i = 0; i < N; i += n<<1) {
				CP *w = (D == 1 ? p_w : p_w + MAXN), *a = A+i, *b = A+i+n;
				for (int j = 0; j < n; j++, a++, b++, w += m) {
					CP x = *w **b;
					*b = *a - x;
					*a += x;
				}
			}
		}
		if (D != 1) for (int i = 0; i < N; i++) A[i].x /= N, A[i].y /= N;
	}

	void conv(int *A, int *B, int *C, int N, int MOD) {
		if (N <= 64) {
			static int temp[64];
			memset(temp, 0, sizeof(int)*N);
			for (int i = 0; i < N; i++) {
				for (int j = 0; j < N-i; j++) temp[i+j] = (temp[i+j] + 1LL * A[i] * B[j]) % MOD;
				for (int j = N-i; j < N; j++) temp[i+j-N] = (temp[i+j-N] + 1LL * A[i] * B[j]) % MOD;
			}
			memcpy(C, temp, sizeof(int)*N);
			return;
		}
		for (int i = 0; i < N; i++) f[i] = CP(A[i], 0);
		FFT(f, N);
		for (int i = 0; i < N; i++) g[i] = CP(B[i], 0);
		FFT(g, N);
		for (int i = 0; i < N; i++) h[i] = f[i] * g[i];
		FFT(h, N, -1);
		for (int i = 0; i < N; i++) C[i] = int(h[i].x + 0.5) % MOD;
	}
};

int a[MAXN], b[MAXN], c[MAXN];

int solve(int st, int en, int *a) {
	int deg = 0;
	for (int i = st; i <= en; i++) deg += c[i] * i;
	int sum = 0;
	int flg = 0;
	for (int i = st; i <= en; i++) if (c[i]) flg++;
	if (flg == 0) {
		a[0] = 1;
		return 0;
	}
	if (flg == 1) {
		for (int i = st; i <= en; i++) {
			if (c[i]) {
				for (int j = 0; j <= i * c[i]; j++) a[j] = 0;
				for (int j = 0; j <= c[i]; j++) {
					if (j & 1) a[j * i] = P - choose(c[i], j);
					else a[j * i] = choose(c[i], j);
				}
				return deg;
			}
		}
	}
	int n = 1 << (32 - __builtin_clz(deg));
	int mid = st;
	for (int i = st + 1; i <= en; i++) {
		if (sum + c[i] * i > deg / 2) {
			mid = i - 1;
			break;
		}
	}
	int l = solve(st, mid, a);
	int *b = new int[n];
	int r = solve(mid+1, en, b);
	for (int i = l+1; i < n; i++) a[i] = 0;
	for (int i = r+1; i < n; i++) b[i] = 0;
	FFT::conv(a, b, a, n, P);
	delete b;
	return deg;
	assert(0);
}

int main() {
	FFT::init();
	for (int i = 0; i < P; i++) {
		C[i][0] = C[i][i] = 1;
		for (int j = 1; j < i; j++) C[i][j] = (C[i-1][j] + C[i-1][j-1]) % P;
	}
	int n, m, k; scanf("%d%d%d", &n, &m, &k);
	for (int i = 1; i <= n; i++) scanf("%d", &a[i]), b[a[i]]++;
	for (int i = 1; i <= m; i++) c[b[i] + 1]++;
	int deg = solve(1, n + 1, a);
	for (int i = 0; i <= deg; i++) b[i] = choose(m + i - 1, i);
	int ans = 0;
	for (int i = 0; i <= deg && i <= k; i++) ans = (ans + b[i] * a[k - i]) % P;
	cout << ans << endl;
	return 0;
}


/////////////////////////   _LeMur_
#include <iostream>
#include <algorithm>
#include <time.h>
#include <stack>
#include <string>
#include <cstring>
#include <cassert>
#include <complex>
#include <cstdio>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <set>

using namespace std;

const int N = 200005;
const int inf = 1000 * 1000 * 1000;
const int mod = 1000 + 9;

typedef complex< double > cd;

int n , m , k;
int sz = 0;
int q[N];

int ind[N * 30];

void fft(vector <cd> &a){
    int n = (int)a.size();
    int h = 0 , _n = n;

    while(_n % 2 == 0){
        _n /= 2;
        h++;
    }

    for(int i=0;i<n;i++){
        if(i < ind[i]){
            swap(a[i] , a[ind[i]]);
        }
    }

    for(int i=1;i<=h;i++){
        int x = (1 << i);
        double alfa = 2.0 * acos(-1.0) / x;
        cd wn(cos(alfa) , sin(alfa));
        for(int j=0;j<n;j+=x){
            cd w(1);
            for(int h=j;h<j + x / 2;h++){
                cd u = a[h];
                cd v = w * a[h + x / 2];
                a[h] = u + v;
                a[h + x / 2] = u - v;
                w *= wn;
            }
        }
    }
}

void inv(vector <cd> &a){
    fft(a);
    for(int i=0;i<(int)a.size();i++){
        a[i] /= (int)a.size();
    }
    reverse(a.begin() + 1 , a.end());
}

vector <cd> mult(vector <cd> &a,vector <cd> &b){
    int n = 1 , h = 0;
    int sz = (int)a.size() + (int)b.size();

    while(n < sz){
        n *= 2;
        h++;
    }

    ind[0] = 0;
    for(int i=0;i<h;i++){
        int x = (1 << i);
        for(int j=x;j<2*x;j++){
            ind[j] = ind[j - x] ^ (1 << (h - i - 1));
        }
    }

    a.resize(n);
    b.resize(n);

    fft(a);
    fft(b);

    for(int i=0;i<n;i++){
        a[i] *= b[i];
    }

    inv(a);

    for(int i=0;i<n;i++){
        int x = (long long)(a[i].real() + 0.5) % mod;
        a[i] = x;
    }

    return a;
}

vector <int> mas;

vector <cd> solve(int l,int r){
    if(l == r){
        int id = mas[l];
        vector <cd> answ(q[id] + 1);
        for(int i=0;i<=q[id];i++){
            answ[i] = 1;
        }
        return answ;
    }
    int m = (l + r) / 2;
    vector <cd> A = solve(l , m);
    vector <cd> B = solve(m + 1 , r);
    return mult(A , B);
}

int main(){
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;i++){
        int a;
        scanf("%d",&a);
        q[a]++;
    }
    for(int i=1;i<=m;i++){
        if(q[i]){
            mas.push_back(i);
        }
    }
    srand(373);
    random_shuffle(mas.begin() , mas.end());
    vector <cd> g = solve(0 , (int)mas.size() - 1);
    cout<<g[k].real()<<endl;
    return 0;
}


/////////////////////////   _LeMur_
#include <iostream>
#include <algorithm>
#include <time.h>
#include <stack>
#include <string>
#include <cstring>
#include <cassert>
#include <complex>
#include <cstdio>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <set>

using namespace std;

const int N = 200005;
const int inf = 1000 * 1000 * 1000;
const int mod = 1000 + 9;

typedef complex< double > cd;

int n , m , k;
int sz = 0;
int q[N];

int ind[N * 30];

void fft(vector <cd> &a){
    int n = (int)a.size();
    int h = 0 , _n = n;

    while(_n % 2 == 0){
        _n /= 2;
        h++;
    }

    for(int i=0;i<n;i++){
        if(i < ind[i]){
            swap(a[i] , a[ind[i]]);
        }
    }

    for(int i=1;i<=h;i++){
        int x = (1 << i);
        double alfa = 2.0 * acos(-1.0) / x;
        cd wn(cos(alfa) , sin(alfa));
        for(int j=0;j<n;j+=x){
            cd w(1);
            for(int h=j;h<j + x / 2;h++){
                cd u = a[h];
                cd v = w * a[h + x / 2];
                a[h] = u + v;
                a[h + x / 2] = u - v;
                w *= wn;
            }
        }
    }
}

void inv(vector <cd> &a){
    fft(a);
    for(int i=0;i<(int)a.size();i++){
        a[i] /= (int)a.size();
    }
    reverse(a.begin() + 1 , a.end());
}

void mult(vector <cd> &a,vector <cd> &b){
    int n = 1 , h = 0;
    int sz = (int)a.size() + (int)b.size() - 1;

    while(n < sz){
        n *= 2;
        h++;
    }

    ind[0] = 0;
    for(int i=0;i<h;i++){
        int x = (1 << i);
        for(int j=x;j<2*x;j++){
            ind[j] = ind[j - x] ^ (1 << (h - i - 1));
        }
    }

    a.resize(n);
    b.resize(n);

    fft(a);
    fft(b);

    for(int i=0;i<n;i++){
        a[i] *= b[i];
    }

    inv(a);

    vector <int> answ(n);

    for(int i=0;i<n;i++){
        int x = (long long)(a[i].real() + 0.5) % mod;
        a[i] = x;
    }
}

vector <int> mas;

vector <cd> solve(int l,int r){
    if(l == r){
        int id = mas[l];
        vector <cd> answ(q[id] + 1 , 1);
        return answ;
    }
    int m = (l + r) / 2;
    vector <cd> A = solve(l , m);
    vector <cd> B = solve(m + 1 , r);
    mult(A , B);
    return A;
}

int main(){
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;i++){
        int a;
        scanf("%d",&a);
        q[a]++;
    }
    for(int i=1;i<=m;i++){
        if(q[i]){
            mas.push_back(i);
        }
    }
    vector <cd> g = solve(0 , (int)mas.size() - 1);
    cout<<g[k].real()<<endl;
    return 0;
}


/////////////////////////   _LeMur_
#include <iostream>
#include <algorithm>
#include <time.h>
#include <stack>
#include <string>
#include <cstring>
#include <cassert>
#include <complex>
#include <cstdio>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <set>

using namespace std;

const int N = 200005;
const int inf = 1000 * 1000 * 1000;
const int mod = 1000 + 9;

struct cd{
    double x , y;
    cd(double xx = 0.0,double yy = 0.0){
        x = xx;
        y = yy;
    }
    cd operator+(const cd &a){
        return cd(x + a.x , y + a.y);
    }
    cd operator-(const cd &a){
        return cd(x - a.x , y - a.y);
    }
    cd operator*(const cd &a){
        return cd(x * a.x - y * a.y , x * a.y + y * a.x);
    }
    cd operator/(const double &k){
        return cd(x / k , y / k);
    }
};

int n , m , k;
int sz = 0;
int q[N];

int ind[N * 30];

void fft(vector <cd> &a){
    int n = (int)a.size();
    int h = 0 , _n = n;

    while(_n % 2 == 0){
        _n /= 2;
        h++;
    }

    for(int i=0;i<n;i++){
        if(i < ind[i]){
            swap(a[i] , a[ind[i]]);
        }
    }

    for(int i=1;i<=h;i++){
        int x = (1 << i);
        double alfa = 2.0 * acos(-1.0) / x;
        cd wn(cos(alfa) , sin(alfa));
        for(int j=0;j<n;j+=x){
            cd w(1);
            for(int h=j;h<j + x / 2;h++){
                cd u = a[h];
                cd v = w * a[h + x / 2];
                a[h] = u + v;
                a[h + x / 2] = u - v;
                w = w * wn;
            }
        }
    }
}

void inv(vector <cd> &a){
    fft(a);
    for(int i=0;i<(int)a.size();i++){
        a[i] = a[i] / (int)a.size();
    }
    reverse(a.begin() + 1 , a.end());
}

void mult(vector <cd> &a,vector <cd> &b){
    int n = 1 , h = 0;
    int sz = (int)a.size() + (int)b.size() - 1;

    while(n < sz){
        n *= 2;
        h++;
    }

    ind[0] = 0;
    for(int i=0;i<h;i++){
        int x = (1 << i);
        for(int j=x;j<2*x;j++){
            ind[j] = ind[j - x] ^ (1 << (h - i - 1));
        }
    }

    a.resize(n);
    b.resize(n);

    fft(a);
    fft(b);

    for(int i=0;i<n;i++){
        a[i] = a[i] * b[i];
    }

    inv(a);

    vector <int> answ(n);

    for(int i=0;i<n;i++){
        int x = (long long)(a[i].x + 0.5) % mod;
        a[i] = x;
    }
}

vector <int> mas;

vector <cd> solve(int l,int r){
    if(l == r){
        int id = mas[l];
        vector <cd> answ(q[id] + 1 , 1);
        return answ;
    }
    int m = (l + r) / 2;
    vector <cd> A = solve(l , m);
    vector <cd> B = solve(m + 1 , r);
    mult(A , B);
    return A;
}

int main(){
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;i++){
        int a;
        scanf("%d",&a);
        q[a]++;
    }
    for(int i=1;i<=m;i++){
        if(q[i]){
            mas.push_back(i);
        }
    }
    vector <cd> g = solve(0 , (int)mas.size() - 1);
    cout<<g[k].x<<endl;
    return 0;
}


/////////////////////////   _LeMur_
#include <iostream>
#include <algorithm>
#include <time.h>
#include <stack>
#include <string>
#include <cstring>
#include <cassert>
#include <complex>
#include <cstdio>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <set>

using namespace std;

const int N = 200005;
const int inf = 1000 * 1000 * 1000;
const int mod = 1000 + 9;

typedef complex< double > cd;

int n , m , k;
int sz = 0;
int q[N];

int ind[N * 4];

void fft(vector <cd> &a){
    int n = (int)a.size();
    int h = 0 , _n = n;

    while(_n % 2 == 0){
        _n /= 2;
        h++;
    }

    for(int i=0;i<n;i++){
        if(i < ind[i]){
            swap(a[i] , a[ind[i]]);
        }
    }

    for(int i=1;i<=h;i++){
        int x = (1 << i);
        double alfa = 2.0 * acos(-1.0) / x;
        cd wn(cos(alfa) , sin(alfa));
        for(int j=0;j<n;j+=x){
            cd w(1);
            for(int h=j;h<j + x / 2;h++){
                cd u = a[h];
                cd v = w * a[h + x / 2];
                a[h] = u + v;
                a[h + x / 2] = u - v;
                w *= wn;
            }
        }
    }
}

void inv(vector <cd> &a){
    fft(a);
    for(int i=0;i<(int)a.size();i++){
        a[i] /= (int)a.size();
    }
    reverse(a.begin() + 1 , a.end());
}

void mult(vector <cd> &a,vector <cd> &b){
    int n = 1 , h = 0;

    while(n < sz){
        n *= 2;
        h++;
    }

    ind[0] = 0;
    for(int i=0;i<h;i++){
        int x = (1 << i);
        for(int j=x;j<2*x;j++){
            ind[j] = ind[j - x] ^ (1 << (h - i - 1));
        }
    }

    a.resize(n);
    b.resize(n);

    fft(a);
    fft(b);

    for(int i=0;i<n;i++){
        a[i] *= b[i];
    }

    inv(a);

    for(int i=0;i<n;i++){
        int x = (long long)(a[i].real() + 0.5) % mod;
        a[i] = x;
    }
}

int main(){
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;i++){
        int a;
        scanf("%d",&a);
        q[a]++;
    }
    vector <cd> a(1);
    a[0] = 1;
    sz = 1;
    for(int i=1;i<=m;i++){
        sz += q[i] + 1;
        if(q[i] == 0)continue;
        vector <cd> b(q[i] + 1);
        for(int j=0;j<=q[i];j++){
            b[j] = 1;
        }
        mult(a , b);
    }
    cout<<a[k].real()<<endl;
    return 0;
}


/////////////////////////   _LeMur_
#include <iostream>
#include <algorithm>
#include <time.h>
#include <stack>
#include <string>
#include <cstring>
#include <cassert>
#include <complex>
#include <cstdio>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <set>

using namespace std;

const int N = 200005;
const int inf = 1000 * 1000 * 1000;
const int mod = 1000 + 9;

typedef complex< double > cd;

int n , m , k;
int sz = 0;
int q[N];

int ind[N * 30];

void fft(vector <cd> &a){
    int n = (int)a.size();
    int h = 0 , _n = n;

    while(_n % 2 == 0){
        _n /= 2;
        h++;
    }

    for(int i=0;i<n;i++){
        if(i < ind[i]){
            swap(a[i] , a[ind[i]]);
        }
    }

    for(int i=1;i<=h;i++){
        int x = (1 << i);
        double alfa = 2.0 * acos(-1.0) / x;
        cd wn(cos(alfa) , sin(alfa));
        for(int j=0;j<n;j+=x){
            cd w(1);
            for(int h=j;h<j + x / 2;h++){
                cd u = a[h];
                cd v = w * a[h + x / 2];
                a[h] = u + v;
                a[h + x / 2] = u - v;
                w *= wn;
            }
        }
    }
}

void inv(vector <cd> &a){
    fft(a);
    for(int i=0;i<(int)a.size();i++){
        a[i] /= (int)a.size();
    }
    reverse(a.begin() + 1 , a.end());
}

vector <int> mult(vector <int> &aa,vector <int> &bb){
    vector <cd> a , b;
    for(int i=0;i<(int)aa.size();i++){
        a.push_back(cd(aa[i]));
    }

    for(int i=0;i<(int)bb.size();i++){
        b.push_back(cd(bb[i]));
    }

    int n = 1 , h = 0;
    int sz = (int)a.size() + (int)b.size();

    while(n < sz){
        n *= 2;
        h++;
    }

    ind[0] = 0;
    for(int i=0;i<h;i++){
        int x = (1 << i);
        for(int j=x;j<2*x;j++){
            ind[j] = ind[j - x] ^ (1 << (h - i - 1));
        }
    }

    a.resize(n);
    b.resize(n);

    fft(a);
    fft(b);

    for(int i=0;i<n;i++){
        a[i] *= b[i];
    }

    inv(a);

    vector <int> answ(n);

    for(int i=0;i<n;i++){
        int x = (long long)(a[i].real() + 0.5) % mod;
        answ[i] = x;
    }

    return answ;
}

vector <int> mas;

vector <int> solve(int l,int r){
    if(l == r){
        int id = mas[l];
        vector <int> answ(q[id] + 1 , 1);
        return answ;
    }
    int m = (l + r) / 2;
    vector <int> A = solve(l , m);
    vector <int> B = solve(m + 1 , r);
    return mult(A , B);
}

int main(){
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;i++){
        int a;
        scanf("%d",&a);
        q[a]++;
    }
    for(int i=1;i<=m;i++){
        if(q[i]){
            mas.push_back(i);
        }
    }
    vector <int> g = solve(0 , (int)mas.size() - 1);
    cout<<g[k]<<endl;
    return 0;
}


/////////////////////////   _LeMur_
#include <iostream>
#include <algorithm>
#include <time.h>
#include <stack>
#include <string>
#include <cstring>
#include <cassert>
#include <complex>
#include <cstdio>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <set>

using namespace std;

const int N = 200005;
const int inf = 1000 * 1000 * 1000;
const int mod = 1000 + 9;

typedef complex< double > cd;

int n , m , k;
int sz = 0;
int q[N];

int ind[N * 30];

void fft(vector <cd> &a){
    int n = (int)a.size();
    int h = 0 , _n = n;

    while(_n % 2 == 0){
        _n /= 2;
        h++;
    }

    for(int i=0;i<n;i++){
        if(i < ind[i]){
            swap(a[i] , a[ind[i]]);
        }
    }

    for(int i=1;i<=h;i++){
        int x = (1 << i);
        double alfa = 2.0 * acos(-1.0) / x;
        cd wn(cos(alfa) , sin(alfa));
        for(int j=0;j<n;j+=x){
            cd w(1);
            for(int h=j;h<j + x / 2;h++){
                cd u = a[h];
                cd v = w * a[h + x / 2];
                a[h] = u + v;
                a[h + x / 2] = u - v;
                w *= wn;
            }
        }
    }
}

void inv(vector <cd> &a){
    fft(a);
    for(int i=0;i<(int)a.size();i++){
        a[i] /= (int)a.size();
    }
    reverse(a.begin() + 1 , a.end());
}

vector <cd> mult(vector <cd> &a,vector <cd> &b){
    int n = 1 , h = 0;
    int sz = (int)a.size() + (int)b.size();

    while(n < sz){
        n *= 2;
        h++;
    }

    ind[0] = 0;
    for(int i=0;i<h;i++){
        int x = (1 << i);
        for(int j=x;j<2*x;j++){
            ind[j] = ind[j - x] ^ (1 << (h - i - 1));
        }
    }

    a.resize(n);
    b.resize(n);

    fft(a);
    fft(b);

    for(int i=0;i<n;i++){
        a[i] *= b[i];
    }

    inv(a);

    for(int i=0;i<n;i++){
        int x = (long long)(a[i].real() + 0.5) % mod;
        a[i] = x;
    }

    return a;
}

vector <int> mas;

vector <cd> solve(int l,int r){
    if(l == r){
        int id = mas[l];
        vector <cd> answ(q[id] + 1);
        for(int i=0;i<=q[id];i++){
            answ[i] = 1;
        }
        return answ;
    }
    int m = (l + r) / 2;
    vector <cd> A = solve(l , m);
    vector <cd> B = solve(m + 1 , r);
    return mult(A , B);
}

int main(){
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;i++){
        int a;
        scanf("%d",&a);
        q[a]++;
    }
    for(int i=1;i<=m;i++){
        if(q[i]){
            mas.push_back(i);
        }
    }
    vector <cd> g = solve(0 , (int)mas.size() - 1);
    cout<<g[k].real()<<endl;
    return 0;
}


/////////////////////////   _LeMur_
#include <iostream>
#include <algorithm>
#include <time.h>
#include <stack>
#include <string>
#include <cstring>
#include <cassert>
#include <complex>
#include <cstdio>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <set>

using namespace std;

const int N = 200005;
const int inf = 1000 * 1000 * 1000;
const int mod = 1000 + 9;

typedef complex< double > cd;

int n , m , k;
int q[N];

int ind[N * 4];

void fft(vector <cd> &a){
    int n = (int)a.size();
    int h = 0 , _n = n;

    while(_n % 2 == 0){
        _n /= 2;
        h++;
    }

    for(int i=0;i<n;i++){
        if(i < ind[i]){
            swap(a[i] , a[ind[i]]);
        }
    }

    for(int i=1;i<=h;i++){
        int x = (1 << i);
        double alfa = 2.0 * acos(-1.0) / x;
        cd wn(cos(alfa) , sin(alfa));
        for(int j=0;j<n;j+=x){
            cd w(1);
            for(int h=j;h<j + x / 2;h++){
                cd u = a[h];
                cd v = w * a[h + x / 2];
                a[h] = u + v;
                a[h + x / 2] = u - v;
                w *= wn;
            }
        }
    }
}

void inv(vector <cd> &a){
    fft(a);
    for(int i=0;i<(int)a.size();i++){
        a[i] /= (int)a.size();
    }
    reverse(a.begin() + 1 , a.end());
}

void mult(vector <cd> &a,vector <cd> &b){
    int n = 1 , h = 0;
    int sz = (int)a.size() + (int)b.size();

    while(n < sz){
        n *= 2;
        h++;
    }

    ind[0] = 0;
    for(int i=0;i<h;i++){
        int x = (1 << i);
        for(int j=x;j<2*x;j++){
            ind[j] = ind[j - x] ^ (1 << (h - i - 1));
        }
    }

    a.resize(n);
    b.resize(n);

    fft(a);
    fft(b);

    for(int i=0;i<n;i++){
        a[i] *= b[i];
    }

    inv(a);

    for(int i=0;i<n;i++){
        int x = (long long)(a[i].real() + 0.5) % mod;
        a[i] = x;
    }
}

int main(){
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;i++){
        int a;
        scanf("%d",&a);
        q[a]++;
    }
    vector <cd> a(1);
    a[0] = 1;
    for(int i=1;i<=m;i++){
        if(q[i] == 0)continue;
        vector <cd> b(q[i] + 1);
        for(int j=0;j<=q[i];j++){
            b[j] = 1;
        }
        mult(a , b);
    }
    cout<<a[k].real()<<endl;
    return 0;
}


/////////////////////////   _LeMur_
#include <iostream>
#include <algorithm>
#include <time.h>
#include <stack>
#include <string>
#include <cstring>
#include <cassert>
#include <complex>
#include <cstdio>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <set>

using namespace std;

const int N = 200005;
const int inf = 1000 * 1000 * 1000;
const int mod = 1000 + 9;

typedef complex< double > cd;

int n , m , k;
int sz = 0;
int q[N];

int ind[N * 4];

void fft(vector <cd> &a){
    int n = (int)a.size();
    int h = 0 , _n = n;

    while(_n % 2 == 0){
        _n /= 2;
        h++;
    }

    for(int i=0;i<n;i++){
        if(i < ind[i]){
            swap(a[i] , a[ind[i]]);
        }
    }

    for(int i=1;i<=h;i++){
        int x = (1 << i);
        double alfa = 2.0 * acos(-1.0) / x;
        cd wn(cos(alfa) , sin(alfa));
        for(int j=0;j<n;j+=x){
            cd w(1);
            for(int h=j;h<j + x / 2;h++){
                cd u = a[h];
                cd v = w * a[h + x / 2];
                a[h] = u + v;
                a[h + x / 2] = u - v;
                w *= wn;
            }
        }
    }
}

void inv(vector <cd> &a){
    fft(a);
    for(int i=0;i<(int)a.size();i++){
        a[i] /= (int)a.size();
    }
    reverse(a.begin() + 1 , a.end());
}

void mult(vector <cd> &a,vector <cd> &b){
    int n = 1 , h = 0;

    while(n < sz){
        n *= 2;
        h++;
    }

    ind[0] = 0;
    for(int i=0;i<h;i++){
        int x = (1 << i);
        for(int j=x;j<2*x;j++){
            ind[j] = ind[j - x] ^ (1 << (h - i - 1));
        }
    }

    a.resize(n);
    b.resize(n);

    fft(a);
    fft(b);

    for(int i=0;i<n;i++){
        a[i] *= b[i];
    }

    inv(a);

    for(int i=0;i<n;i++){
        int x = (long long)(a[i].real() + 0.5) % mod;
        a[i] = x;
    }
}

int main(){
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;i++){
        int a;
        scanf("%d",&a);
        q[a]++;
    }
    vector <cd> a(1);
    a[0] = 1;
    for(int i=1;i<=m;i++){
        sz += q[i];
        if(q[i] == 0)continue;
        vector <cd> b(q[i] + 1);
        for(int j=0;j<=q[i];j++){
            b[j] = 1;
        }
        mult(a , b);
    }
    cout<<a[k].real()<<endl;
    return 0;
}


/////////////////////////   _LeMur_
#include <iostream>
#include <algorithm>
#include <time.h>
#include <stack>
#include <string>
#include <cstring>
#include <cassert>
#include <complex>
#include <cstdio>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <set>

using namespace std;

const int N = 200005;
const int inf = 1000 * 1000 * 1000;
const int mod = 1000 + 9;

typedef complex< double > cd;

int n , m , k;
int sz = 0;
int q[N];

int ind[N * 4];

void fft(vector <cd> &a){
    int n = (int)a.size();
    int h = 0 , _n = n;

    while(_n % 2 == 0){
        _n /= 2;
        h++;
    }

    for(int i=0;i<n;i++){
        if(i < ind[i]){
            swap(a[i] , a[ind[i]]);
        }
    }

    for(int i=1;i<=h;i++){
        int x = (1 << i);
        double alfa = 2.0 * acos(-1.0) / x;
        cd wn(cos(alfa) , sin(alfa));
        for(int j=0;j<n;j+=x){
            cd w(1);
            for(int h=j;h<j + x / 2;h++){
                cd u = a[h];
                cd v = w * a[h + x / 2];
                a[h] = u + v;
                a[h + x / 2] = u - v;
                w *= wn;
            }
        }
    }
}

void inv(vector <cd> &a){
    fft(a);
    for(int i=0;i<(int)a.size();i++){
        a[i] /= (int)a.size();
    }
    reverse(a.begin() + 1 , a.end());
}

vector <cd> mult(vector <cd> &a,vector <cd> &b){
    int n = 1 , h = 0;
    int sz = (int)a.size() + (int)b.size();

    while(n < sz){
        n *= 2;
        h++;
    }

    ind[0] = 0;
    for(int i=0;i<h;i++){
        int x = (1 << i);
        for(int j=x;j<2*x;j++){
            ind[j] = ind[j - x] ^ (1 << (h - i - 1));
        }
    }

    a.resize(n);
    b.resize(n);

    fft(a);
    fft(b);

    for(int i=0;i<n;i++){
        a[i] *= b[i];
    }

    inv(a);

    for(int i=0;i<n;i++){
        int x = (long long)(a[i].real() + 0.5) % mod;
        a[i] = x;
    }

    return a;
}

vector <cd> solve(int l,int r){
    if(l == r){
        vector <cd> answ(q[l] + 1);
        for(int i=0;i<=q[l];i++){
            answ[i] = 1;
        }
        return answ;
    }
    int m = (l + r) / 2;
    vector <cd> A = solve(l , m);
    vector <cd> B = solve(m + 1 , r);
    return mult(A , B);
}

int main(){
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;i++){
        int a;
        scanf("%d",&a);
        q[a]++;
    }
    vector <cd> g = solve(1 , m);
    cout<<g[k].real()<<endl;
    return 0;
}


/////////////////////////   _LeMur_
#include <iostream>
#include <algorithm>
#include <time.h>
#include <stack>
#include <string>
#include <cstring>
#include <cassert>
#include <complex>
#include <cstdio>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <set>

using namespace std;

const int N = 200005;
const int inf = 1000 * 1000 * 1000;
const int mod = 1000 + 9;

typedef complex< double > cd;

int n , m , k;
int sz = 0;
int q[N];

int ind[N * 30];

void fft(vector <cd> &a){
    int n = (int)a.size();
    int h = 0 , _n = n;

    while(_n % 2 == 0){
        _n /= 2;
        h++;
    }

    for(int i=0;i<n;i++){
        if(i < ind[i]){
            swap(a[i] , a[ind[i]]);
        }
    }

    for(int i=1;i<=h;i++){
        int x = (1 << i);
        double alfa = 2.0 * acos(-1.0) / x;
        cd wn(cos(alfa) , sin(alfa));
        for(int j=0;j<n;j+=x){
            cd w(1);
            for(int h=j;h<j + x / 2;h++){
                cd u = a[h];
                cd v = w * a[h + x / 2];
                a[h] = u + v;
                a[h + x / 2] = u - v;
                w *= wn;
            }
        }
    }
}

void inv(vector <cd> &a){
    fft(a);
    for(int i=0;i<(int)a.size();i++){
        a[i] /= (int)a.size();
    }
    reverse(a.begin() + 1 , a.end());
}

vector <cd> mult(vector <cd> &a,vector <cd> &b){
    int n = 1 , h = 0;
    int sz = (int)a.size() + (int)b.size();

    while(n < sz){
        n *= 2;
        h++;
    }

    ind[0] = 0;
    for(int i=0;i<h;i++){
        int x = (1 << i);
        for(int j=x;j<2*x;j++){
            ind[j] = ind[j - x] ^ (1 << (h - i - 1));
        }
    }

    a.resize(n);
    b.resize(n);

    fft(a);
    fft(b);

    for(int i=0;i<n;i++){
        a[i] *= b[i];
    }

    inv(a);

    for(int i=0;i<n;i++){
        int x = (long long)(a[i].real() + 0.5) % mod;
        a[i] = x;
    }

    return a;
}

vector <cd> solve(int l,int r){
    if(l == r){
        vector <cd> answ(q[l] + 1);
        for(int i=0;i<=q[l];i++){
            answ[i] = 1;
        }
        return answ;
    }
    int m = (l + r) / 2;
    vector <cd> A = solve(l , m);
    vector <cd> B = solve(m + 1 , r);
    return mult(A , B);
}

int main(){
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;i++){
        int a;
        scanf("%d",&a);
        q[a]++;
    }
    vector <cd> g = solve(1 , m);
    cout<<g[k].real()<<endl;
    return 0;
}


/////////////////////////   _LeMur_
#pragma GCC optimize("Ofast")
#pragma GCC optimize ("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")

#include <iostream>
#include <algorithm>
#include <time.h>
#include <stack>
#include <string>
#include <cstring>
#include <cassert>
#include <complex>
#include <cstdio>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <set>

using namespace std;

const int N = 200005;
const int inf = 1000 * 1000 * 1000;
const int mod = 1000 + 9;

typedef complex< double > cd;

int n , m , k;
int sz = 0;
int q[N];

int ind[N * 4];

void fft(vector <cd> &a){
    int n = (int)a.size();
    int h = 0 , _n = n;

    while(_n % 2 == 0){
        _n /= 2;
        h++;
    }

    for(int i=0;i<n;i++){
        if(i < ind[i]){
            swap(a[i] , a[ind[i]]);
        }
    }

    for(int i=1;i<=h;i++){
        int x = (1 << i);
        double alfa = 2.0 * acos(-1.0) / x;
        cd wn(cos(alfa) , sin(alfa));
        for(int j=0;j<n;j+=x){
            cd w(1);
            for(int h=j;h<j + x / 2;h++){
                cd u = a[h];
                cd v = w * a[h + x / 2];
                a[h] = u + v;
                a[h + x / 2] = u - v;
                w *= wn;
            }
        }
    }
}

void inv(vector <cd> &a){
    fft(a);
    for(int i=0;i<(int)a.size();i++){
        a[i] /= (int)a.size();
    }
    reverse(a.begin() + 1 , a.end());
}

void mult(vector <cd> &a,vector <cd> &b){
    int n = 1 , h = 0;

    while(n < sz){
        n *= 2;
        h++;
    }

    ind[0] = 0;
    for(int i=0;i<h;i++){
        int x = (1 << i);
        for(int j=x;j<2*x;j++){
            ind[j] = ind[j - x] ^ (1 << (h - i - 1));
        }
    }

    a.resize(n);
    b.resize(n);

    fft(a);
    fft(b);

    for(int i=0;i<n;i++){
        a[i] *= b[i];
    }

    inv(a);

    for(int i=0;i<n;i++){
        int x = (long long)(a[i].real() + 0.5) % mod;
        a[i] = x;
    }
}

int main(){
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;i++){
        int a;
        scanf("%d",&a);
        q[a]++;
    }
    vector <cd> a(1);
    a[0] = 1;
    sz = 1;
    for(int i=1;i<=m;i++){
        sz += q[i] + 1;
        if(q[i] == 0)continue;
        vector <cd> b(q[i] + 1);
        for(int j=0;j<=q[i];j++){
            b[j] = 1;
        }
        mult(a , b);
    }
    cout<<a[k].real()<<endl;
    return 0;
}


/*input
4 3 2
1 2 3 2
*/
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
#define REP(i,j,k)     for(int i = j ; i < k ; ++i)
#define RREP(i,j,k)    for(int i = j ; i >=k ; --i)
#define A    first
#define B    second
#define mp   make_pair
#define pb   emplace_back
#define PII pair<int , int>
#define MEM(i,j)   memset(i , j , sizeof i)
#define ALL(i)     i.begin() , i.end()
#define DBGG(i,j)     cout << i << " " << j << endl
#define DB4(i,j,k,l)  cout << i << " " << j << " " << k << " " << l << endl
#define IOS cin.tie(0) , cout.sync_with_stdio(0)
#define endl "\n"
///------------------------------------------------------------
#define int long long
#define MAX (1 << 19) + 10
#define INF 0x3f3f3f3f
#define mod 1009
#define cplx complex<double>
const double PI = acos(-1);

vector<int> v[MAX];
cplx tmp[MAX] , x[MAX] , y[MAX] , w[MAX] , I(0 , 1);
int nn , base;
void FFT(cplx now[MAX]){
	int siz = 0 , pat = (nn >> 1) - 1;
	RREP(i , base - 1 , 0){
		REP(j , 0 , nn){
			int fr = j >> i , ba = j & pat;
			int a = ((fr & siz) << 1 | 0) << i | ba;
			int b = ((fr & siz) << 1 | 1) << i | ba;
			tmp[j] = now[a] + now[b] * w[fr << i];
		}
		REP(j , 0 , nn) now[j] = tmp[j];
		siz = (siz << 1 | 1) , pat >>= 1;
	}
}
void IFFT(cplx now[MAX]){
	FFT(now) , reverse(now + 1 , now + nn);
	REP(i , 0 , nn) now[i] /= nn;
}
void solve(int a , int b){
	base = 0;
	while((1LL << base) <= v[a].size() + v[b].size()) base ++;
	if((1LL << base) != nn){
		nn = (1LL << base);
		REP(i , 0 , nn) w[i] = exp(2 * PI * i / nn * I);
	}
	REP(i , 0 , nn){
		x[i] = i < v[a].size() ? cplx(v[a][i] , 0) : cplx(0 , 0);
		y[i] = i < v[b].size() ? cplx(v[b][i] , 0) : cplx(0 , 0);
	}
	// for(auto to : v[a]) cout << to << " "; cout << endl;
	// for(auto to : v[b]) cout << to << " "; cout << endl;

	// REP(i , 0 , nn) cout << (int)(x[i].real() + 0.5) << " "; cout << endl;
	// REP(i , 0 , nn) cout << (int)(y[i].real() + 0.5) << " "; cout << endl;
	FFT(x) , FFT(y);
	REP(i , 0 , nn) x[i] = x[i] * y[i];
	IFFT(x);
	// REP(i , 0 , nn) cout << (int)(x[i].real() + 0.5) << " "; cout << endl;
	v[a].clear();
	REP(i , 0 , nn) v[a].pb((int)(x[i].real() + 0.5) % mod);
	while(v[a].back() == 0) v[a].pop_back();
}

int n , m , k , a[MAX] , cnt[MAX];
int32_t main(){
	IOS;
	cin >> n >> m >> k;
	REP(i , 1 , n + 1) cin >> a[i] , cnt[a[i]] ++;
	REP(i , 1 , m + 1) v[i].resize(cnt[i] + 1 , 1);
	priority_queue<PII , vector<PII> , greater<PII>> pq;
	REP(i , 1 , m + 1) pq.push(mp(v[i].size() , i));

	while(pq.size() > 1){
		PII a = pq.top(); pq.pop();
		PII b = pq.top(); pq.pop();
		solve(a.B , b.B);
		pq.push(mp(v[a.B].size() , a.B));
	}
	cout << v[pq.top().B][k] << endl;
    return 0;
}


/*input
4 3 2
1 2 3 2
*/
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
#define REP(i,j,k)     for(int i = j ; i < k ; ++i)
#define RREP(i,j,k)    for(int i = j ; i >=k ; --i)
#define A    first
#define B    second
#define mp   make_pair
#define pb   emplace_back
#define PII pair<int , int>
#define MEM(i,j)   memset(i , j , sizeof i)
#define ALL(i)     i.begin() , i.end()
#define DBGG(i,j)     cout << i << " " << j << endl
#define DB4(i,j,k,l)  cout << i << " " << j << " " << k << " " << l << endl
#define IOS cin.tie(0) , cout.sync_with_stdio(0)
#define endl "\n"
///------------------------------------------------------------
#define int long long
#define MAX (1 << 19) + 10
#define INF 0x3f3f3f3f
#define mod 1009
#define cplx complex<double>
const double PI = acos(-1);

vector<int> v[MAX];
cplx tmp[MAX] , x[MAX] , y[MAX] , w[MAX] , I(0 , 1);
int nn , base;
void FFT(cplx now[MAX]){
	int siz = 0 , pat = (nn >> 1) - 1;
	RREP(i , base - 1 , 0){
		REP(j , 0 , nn){
			int fr = j >> i , ba = j & pat;
			int a = ((fr & siz) << 1 | 0) << i | ba;
			int b = ((fr & siz) << 1 | 1) << i | ba;
			tmp[j] = now[a] + now[b] * w[fr << i];
		}
		REP(j , 0 , nn) now[j] = tmp[j];
		siz = (siz << 1 | 1) , pat >>= 1;
	}
}
void IFFT(cplx now[MAX]){
	FFT(now) , reverse(now + 1 , now + nn);
	REP(i , 0 , nn) now[i] /= nn;
}
void solve(int a , int b){
	base = 0;
	while((1LL << base) <= v[a].size() + v[b].size()) base ++;
	if((1LL << base) != nn){
		nn = (1LL << base);
		REP(i , 0 , nn) w[i] = exp(2 * PI * i / nn * I);
	}
	REP(i , 0 , nn){
		x[i] = i < v[a].size() ? cplx(v[a][i] , 0) : cplx(0 , 0);
		y[i] = i < v[b].size() ? cplx(v[b][i] , 0) : cplx(0 , 0);
	}
	// for(auto to : v[a]) cout << to << " "; cout << endl;
	// for(auto to : v[b]) cout << to << " "; cout << endl;

	// REP(i , 0 , nn) cout << (int)(x[i].real() + 0.5) << " "; cout << endl;
	// REP(i , 0 , nn) cout << (int)(y[i].real() + 0.5) << " "; cout << endl;
	FFT(x) , FFT(y);
	REP(i , 0 , nn) x[i] = x[i] * y[i];
	IFFT(x);
	// REP(i , 0 , nn) cout << (int)(x[i].real() + 0.5) << " "; cout << endl;
	v[a].clear();
	REP(i , 0 , nn) v[a].pb((int)(x[i].real() + 0.5) % mod);
}

int n , m , k , a[MAX] , cnt[MAX];
int32_t main(){
	IOS;
	cin >> n >> m >> k;
	REP(i , 1 , n + 1) cin >> a[i] , cnt[a[i]] ++;
	REP(i , 1 , m + 1) v[i].resize(cnt[i] + 1 , 1);
	priority_queue<PII , vector<PII> , greater<PII>> pq;
	REP(i , 1 , m + 1) pq.push(mp(v[i].size() , i));

	while(pq.size() > 1){
		PII a = pq.top(); pq.pop();
		PII b = pq.top(); pq.pop();
		solve(a.B , b.B);
		pq.push(mp(v[a.B].size() , a.B));
	}
	cout << v[pq.top().B][k] << endl;
    return 0;
}


/*input
4 3 2
1 2 3 2
*/
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
#define REP(i,j,k)     for(int i = j ; i < k ; ++i)
#define RREP(i,j,k)    for(int i = j ; i >=k ; --i)
#define A    first
#define B    second
#define mp   make_pair
#define pb   emplace_back
#define PII pair<int , int>
#define MEM(i,j)   memset(i , j , sizeof i)
#define ALL(i)     i.begin() , i.end()
#define DBGG(i,j)     cout << i << " " << j << endl
#define DB4(i,j,k,l)  cout << i << " " << j << " " << k << " " << l << endl
#define IOS cin.tie(0) , cout.sync_with_stdio(0)
#define endl "\n"
///------------------------------------------------------------
#define int long long
#define MAX (1 << 19) + 10
#define INF 0x3f3f3f3f
#define mod 1009
#define cplx complex<double>
const double PI = acos(-1);

vector<int> v[MAX];
cplx tmp[MAX] , x[MAX] , y[MAX] , w[MAX] , I(0 , 1);
int nn , base;
void FFT(cplx now[MAX]){
	int siz = 0 , pat = (nn >> 1) - 1;
	RREP(i , base - 1 , 0){
		REP(j , 0 , nn){
			int fr = j >> i , ba = j & pat;
			int a = ((fr & siz) << 1 | 0) << i | ba;
			int b = ((fr & siz) << 1 | 1) << i | ba;
			tmp[j] = now[a] + now[b] * w[fr << i];
		}
		REP(j , 0 , nn) now[j] = tmp[j];
		siz = (siz << 1 | 1) , pat >>= 1;
	}
}
void IFFT(cplx now[MAX]){
	FFT(now) , reverse(now + 1 , now + nn);
	REP(i , 0 , nn) now[i] /= nn;
}
void solve(int a , int b){
	base = 0;
	while((1LL << base) <= v[a].size() + v[b].size()) base ++;
	if((1LL << base) <= 900){
		vector<int> sol(v[a].size() + v[b].size());
		REP(i , 0 , v[a].size()) REP(j , 0 , v[b].size()) sol[i + j] += v[a][i] * v[b][j];
		REP(i , 0 , sol.size()) sol[i] %= mod;
		v[a] = sol;
		while(v[a].back() == 0) v[a].pop_back();
		return ;
	}
	if((1LL << base) != nn){
		nn = (1LL << base);
		REP(i , 0 , nn) w[i] = exp(2 * PI * i / nn * I);
	}
	REP(i , 0 , nn){
		x[i] = i < v[a].size() ? cplx(v[a][i] , 0) : cplx(0 , 0);
		y[i] = i < v[b].size() ? cplx(v[b][i] , 0) : cplx(0 , 0);
	}
	FFT(x) , FFT(y);
	REP(i , 0 , nn) x[i] = x[i] * y[i];
	IFFT(x);
	v[a].clear();
	REP(i , 0 , nn) v[a].pb((int)(x[i].real() + 0.5) % mod);
	while(v[a].back() == 0) v[a].pop_back();
}

int n , m , k , a[MAX] , cnt[MAX];
int32_t main(){
	IOS;
	cin >> n >> m >> k;
	REP(i , 1 , n + 1) cin >> a[i] , cnt[a[i]] ++;
	REP(i , 1 , m + 1) v[i].resize(cnt[i] + 1 , 1);
	priority_queue<PII , vector<PII> , greater<PII>> pq;
	REP(i , 1 , m + 1) pq.push(mp(v[i].size() , i));

	while(pq.size() > 1){
		PII a = pq.top(); pq.pop();
		PII b = pq.top(); pq.pop();
		solve(a.B , b.B);
		pq.push(mp(v[a.B].size() , a.B));
	}
	cout << v[pq.top().B][k] << endl;
    return 0;
}


/*input
4 3 2
1 2 3 2
*/
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
#define REP(i,j,k)     for(int i = j ; i < k ; ++i)
#define RREP(i,j,k)    for(int i = j ; i >=k ; --i)
#define A    first
#define B    second
#define mp   make_pair
#define pb   emplace_back
#define PII pair<int , int>
#define MEM(i,j)   memset(i , j , sizeof i)
#define ALL(i)     i.begin() , i.end()
#define DBGG(i,j)     cout << i << " " << j << endl
#define DB4(i,j,k,l)  cout << i << " " << j << " " << k << " " << l << endl
#define IOS cin.tie(0) , cout.sync_with_stdio(0)
#define endl "\n"
///------------------------------------------------------------
#define int long long
#define MAX (1 << 18) + 10
#define INF 0x3f3f3f3f
#define mod 1009
#define cplx complex<double>
const double PI = acos(-1);

vector<int> v[MAX];
cplx tmp[MAX] , x[MAX] , y[MAX] , w[MAX] , I(0 , 1);
int nn , base;
void FFT(cplx now[MAX]){
	int siz = 0 , pat = (nn >> 1) - 1;
	RREP(i , base - 1 , 0){
		REP(j , 0 , nn){
			int fr = j >> i , ba = j & pat;
			int a = ((fr & siz) << 1 | 0) << i | ba;
			int b = ((fr & siz) << 1 | 1) << i | ba;
			tmp[j] = now[a] + now[b] * w[fr << i];
		}
		REP(j , 0 , nn) now[j] = tmp[j];
		siz = (siz << 1 | 1) , pat >>= 1;
	}
}
void IFFT(cplx now[MAX]){
	FFT(now) , reverse(now + 1 , now + nn);
	REP(i , 0 , nn) now[i] /= nn;
}
void solve(int a , int b){
	base = 0;
	while((1LL << base) <= v[a].size() + v[b].size()) base ++;
	if((1LL << base) != nn){
		nn = (1LL << base);
		REP(i , 0 , nn) w[i] = exp(2 * PI * i / nn * I);
	}
	REP(i , 0 , nn){
		x[i] = i < v[a].size() ? cplx(v[a][i] , 0) : cplx(0 , 0);
		y[i] = i < v[b].size() ? cplx(v[b][i] , 0) : cplx(0 , 0);
	}
	// for(auto to : v[a]) cout << to << " "; cout << endl;
	// for(auto to : v[b]) cout << to << " "; cout << endl;

	// REP(i , 0 , nn) cout << (int)(x[i].real() + 0.5) << " "; cout << endl;
	// REP(i , 0 , nn) cout << (int)(y[i].real() + 0.5) << " "; cout << endl;
	FFT(x) , FFT(y);
	REP(i , 0 , nn) x[i] = x[i] * y[i];
	IFFT(x);
	// REP(i , 0 , nn) cout << (int)(x[i].real() + 0.5) << " "; cout << endl;
	v[a].clear();
	REP(i , 0 , nn) v[a].pb((int)(x[i].real() + 0.5) % mod);
}

int n , m , k , a[MAX] , cnt[MAX];
int32_t main(){
	IOS;
	cin >> n >> m >> k;
	REP(i , 1 , n + 1) cin >> a[i] , cnt[a[i]] ++;
	REP(i , 1 , m + 1) v[i].resize(cnt[i] + 1 , 1);
	priority_queue<PII , vector<PII> , greater<PII>> pq;
	REP(i , 1 , m + 1) pq.push(mp(v[i].size() , i));

	while(pq.size() > 1){
		PII a = pq.top(); pq.pop();
		PII b = pq.top(); pq.pop();
		solve(a.B , b.B);
		pq.push(mp(v[a.B].size() , a.B));
	}
	cout << v[pq.top().B][k] << endl;
    return 0;
}


/*input
4 3 2
1 2 3 2
*/
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
#define REP(i,j,k)     for(int i = j ; i < k ; ++i)
#define RREP(i,j,k)    for(int i = j ; i >=k ; --i)
#define A    first
#define B    second
#define mp   make_pair
#define pb   emplace_back
#define PII pair<int , int>
#define MEM(i,j)   memset(i , j , sizeof i)
#define ALL(i)     i.begin() , i.end()
#define DBGG(i,j)     cout << i << " " << j << endl
#define DB4(i,j,k,l)  cout << i << " " << j << " " << k << " " << l << endl
#define IOS cin.tie(0) , cout.sync_with_stdio(0)
#define endl "\n"
///------------------------------------------------------------
#define int long long
#define MAX (1 << 19) + 10
#define INF 0x3f3f3f3f
#define mod 1009
#define cplx complex<double>
const double PI = acos(-1);

vector<int> v[MAX];
cplx tmp[MAX] , x[MAX] , y[MAX] , w[MAX] , I(0 , 1);
int nn , base;
void FFT(cplx now[MAX]){
	int siz = 0 , pat = (nn >> 1) - 1;
	RREP(i , base - 1 , 0){
		REP(j , 0 , nn){
			int fr = j >> i , ba = j & pat;
			int a = ((fr & siz) << 1 | 0) << i | ba;
			int b = ((fr & siz) << 1 | 1) << i | ba;
			tmp[j] = now[a] + now[b] * w[fr << i];
		}
		REP(j , 0 , nn) now[j] = tmp[j];
		siz = (siz << 1 | 1) , pat >>= 1;
	}
}
void IFFT(cplx now[MAX]){
	FFT(now) , reverse(now + 1 , now + nn);
	REP(i , 0 , nn) now[i] /= nn;
}
void solve(int a , int b){
	base = 0;
	while((1LL << base) <= v[a].size() + v[b].size()) base ++;
	if((1LL << base) <= 300){
		vector<int> sol(v[a].size() + v[b].size());
		REP(i , 0 , v[a].size()) REP(j , 0 , v[b].size()) sol[i + j] += v[a][i] * v[b][j];
		REP(i , 0 , sol.size()) sol[i] %= mod;
		v[a] = sol;
		while(v[a].back() == 0) v[a].pop_back();
		return ;
	}
	if((1LL << base) != nn){
		nn = (1LL << base);
		REP(i , 0 , nn) w[i] = exp(2 * PI * i / nn * I);
	}
	REP(i , 0 , nn){
		x[i] = i < v[a].size() ? cplx(v[a][i] , 0) : cplx(0 , 0);
		y[i] = i < v[b].size() ? cplx(v[b][i] , 0) : cplx(0 , 0);
	}
	FFT(x) , FFT(y);
	REP(i , 0 , nn) x[i] = x[i] * y[i];
	IFFT(x);
	v[a].clear();
	REP(i , 0 , nn) v[a].pb((int)(x[i].real() + 0.5) % mod);
	while(v[a].back() == 0) v[a].pop_back();
}

int n , m , k , a[MAX] , cnt[MAX];
int32_t main(){
	IOS;
	cin >> n >> m >> k;
	REP(i , 1 , n + 1) cin >> a[i] , cnt[a[i]] ++;
	REP(i , 1 , m + 1) v[i].resize(cnt[i] + 1 , 1);
	priority_queue<PII , vector<PII> , greater<PII>> pq;
	REP(i , 1 , m + 1) pq.push(mp(v[i].size() , i));

	while(pq.size() > 1){
		PII a = pq.top(); pq.pop();
		PII b = pq.top(); pq.pop();
		solve(a.B , b.B);
		pq.push(mp(v[a.B].size() , a.B));
	}
	cout << v[pq.top().B][k] << endl;
    return 0;
}


/*input
4 3 2
1 2 3 2
*/
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
#define REP(i,j,k)     for(int i = j ; i < k ; ++i)
#define RREP(i,j,k)    for(int i = j ; i >=k ; --i)
#define A    first
#define B    second
#define mp   make_pair
#define pb   emplace_back
#define PII pair<int , int>
#define MEM(i,j)   memset(i , j , sizeof i)
#define ALL(i)     i.begin() , i.end()
#define DBGG(i,j)     cout << i << " " << j << endl
#define DB4(i,j,k,l)  cout << i << " " << j << " " << k << " " << l << endl
#define IOS cin.tie(0) , cout.sync_with_stdio(0)
#define endl "\n"
///------------------------------------------------------------
#define MAX (1 << 18) + 10
#define INF 0x3f3f3f3f
#define mod 1009
#define cplx complex<double>
const double PI = acos(-1);

vector<int> v[MAX];
cplx tmp[MAX] , x[MAX] , y[MAX] , w[MAX] , I(0 , 1);
int nn , base , maxn = (1 << 18);
void FFT(cplx now[MAX]){
	int siz = 0 , pat = (nn >> 1) - 1 , mul = 18 - base;
	RREP(i , base - 1 , 0){
		REP(j , 0 , nn){
			int fr = j >> i , ba = j & pat;
			int a = ((fr & siz) << 1 | 0) << i | ba;
			int b = ((fr & siz) << 1 | 1) << i | ba;
			tmp[j] = now[a] + now[b] * w[fr << i << mul];
		}
		REP(j , 0 , nn) now[j] = tmp[j];
		siz = (siz << 1 | 1) , pat >>= 1;
	}
}
void IFFT(cplx now[MAX]){
	FFT(now) , reverse(now + 1 , now + nn);
	REP(i , 0 , nn) now[i] /= nn;
}
void solve(int a , int b){
	base = 0;
	while((1 << base) <= v[a].size() + v[b].size()) base ++ , nn = (1 << base);

	REP(i , 0 , nn){
		x[i] = i < v[a].size() ? cplx(v[a][i] , 0) : cplx(0 , 0);
		y[i] = i < v[b].size() ? cplx(v[b][i] , 0) : cplx(0 , 0);
	}
	FFT(x) , FFT(y);
	REP(i , 0 , nn) x[i] = x[i] * y[i];
	IFFT(x);

	v[a].clear();
	REP(i , 0 , nn) v[a].pb((long long)(	x[i].real() + 0.5) % mod);
	while(v[a].back() == 0) v[a].pop_back();
}

int n , m , k , a[MAX] , cnt[MAX];
int32_t main(){
	IOS;
	cin >> n >> m >> k;
	REP(i , 1 , n + 1) cin >> a[i] , cnt[a[i]] ++;
	REP(i , 1 , m + 1) v[i].resize(cnt[i] + 1 , 1);

	REP(i , 0 , maxn) w[i] = exp(2 * PI * i / maxn * I);
	priority_queue<PII , vector<PII> , greater<PII>> pq;
	REP(i , 1 , m + 1) pq.push(mp(v[i].size() , i));
	while(pq.size() > 1){
		PII a = pq.top(); pq.pop();
		PII b = pq.top(); pq.pop();
		solve(a.B , b.B);
		pq.push(mp(v[a.B].size() , a.B));
	}
	cout << v[pq.top().B][k] << endl;
    return 0;
}


/*input
4 3 2
1 2 3 2
*/
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
#define REP(i,j,k)     for(int i = j ; i < k ; ++i)
#define RREP(i,j,k)    for(int i = j ; i >=k ; --i)
#define A    first
#define B    second
#define mp   make_pair
#define pb   emplace_back
#define PII pair<int , int>
#define MEM(i,j)   memset(i , j , sizeof i)
#define ALL(i)     i.begin() , i.end()
#define DBGG(i,j)     cout << i << " " << j << endl
#define DB4(i,j,k,l)  cout << i << " " << j << " " << k << " " << l << endl
#define IOS cin.tie(0) , cout.sync_with_stdio(0)
#define endl "\n"
///------------------------------------------------------------
#define int long long
#define MAX (1 << 19) + 10
#define INF 0x3f3f3f3f
#define mod 1009
#define cplx complex<double>
const double PI = acos(-1);

vector<int> v[MAX];
cplx tmp[MAX] , x[MAX] , y[MAX] , w[MAX] , I(0 , 1);
int nn , base , maxn = (1 << 19);
void FFT(cplx now[MAX]){
	int siz = 0 , pat = (nn >> 1) - 1 , mul = maxn / nn;
	RREP(i , base - 1 , 0){
		REP(j , 0 , nn){
			int fr = j >> i , ba = j & pat;
			int a = ((fr & siz) << 1 | 0) << i | ba;
			int b = ((fr & siz) << 1 | 1) << i | ba;
			tmp[j] = now[a] + now[b] * w[(fr << i) * mul];
		}
		REP(j , 0 , nn) now[j] = tmp[j];
		siz = (siz << 1 | 1) , pat >>= 1;
	}
}
void IFFT(cplx now[MAX]){
	FFT(now) , reverse(now + 1 , now + nn);
	REP(i , 0 , nn) now[i] /= nn;
}
void solve(int a , int b){
	base = 0;
	while((1LL << base) <= v[a].size() + v[b].size()) base ++ , nn = (1 << base);

	REP(i , 0 , nn){
		x[i] = i < v[a].size() ? cplx(v[a][i] , 0) : cplx(0 , 0);
		y[i] = i < v[b].size() ? cplx(v[b][i] , 0) : cplx(0 , 0);
	}
	FFT(x) , FFT(y);
	REP(i , 0 , nn) x[i] = x[i] * y[i];
	IFFT(x);

	v[a].clear();
	REP(i , 0 , nn) v[a].pb((int)(x[i].real() + 0.5) % mod);
	while(v[a].back() == 0) v[a].pop_back();
}

int n , m , k , a[MAX] , cnt[MAX];
int32_t main(){
	IOS;
	cin >> n >> m >> k;
	REP(i , 1 , n + 1) cin >> a[i] , cnt[a[i]] ++;
	REP(i , 1 , m + 1) v[i].resize(cnt[i] + 1 , 1);

	REP(i , 0 , maxn) w[i] = exp(2 * PI * i / maxn * I);
	priority_queue<PII , vector<PII> , greater<PII>> pq;
	REP(i , 1 , m + 1) pq.push(mp(v[i].size() , i));
	while(pq.size() > 1){
		PII a = pq.top(); pq.pop();
		PII b = pq.top(); pq.pop();
		solve(a.B , b.B);
		pq.push(mp(v[a.B].size() , a.B));
	}
	cout << v[pq.top().B][k] << endl;
    return 0;
}


/*input
4 3 2
1 2 3 2
*/
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
#define REP(i,j,k)     for(int i = j ; i < k ; ++i)
#define RREP(i,j,k)    for(int i = j ; i >=k ; --i)
#define A    first
#define B    second
#define mp   make_pair
#define pb   emplace_back
#define PII pair<int , int>
#define MEM(i,j)   memset(i , j , sizeof i)
#define ALL(i)     i.begin() , i.end()
#define DBGG(i,j)     cout << i << " " << j << endl
#define DB4(i,j,k,l)  cout << i << " " << j << " " << k << " " << l << endl
#define IOS cin.tie(0) , cout.sync_with_stdio(0)
#define endl "\n"
///------------------------------------------------------------
#define int long long
#define MAX 400000
#define INF 0x3f3f3f3f
#define mod 1009
#define cplx complex<double>
const double PI = acos(-1);

vector<int> v[MAX];
cplx tmp[MAX] , x[MAX] , y[MAX] , w[MAX] , I(0 , 1);
int nn , base;
void FFT(cplx now[MAX]){
	int siz = 0 , pat = (nn >> 1) - 1;
	RREP(i , base - 1 , 0){
		REP(j , 0 , nn){
			int fr = j >> i , ba = j & pat;
			int a = ((fr & siz) << 1 | 0) << i | ba;
			int b = ((fr & siz) << 1 | 1) << i | ba;
			tmp[j] = now[a] + now[b] * w[fr << i];
		}
		REP(j , 0 , nn) now[j] = tmp[j];
		siz = (siz << 1 | 1) , pat >>= 1;
	}
}
void IFFT(cplx now[MAX]){
	FFT(now) , reverse(now + 1 , now + nn);
	REP(i , 0 , nn) now[i] /= nn;
}
void solve(int a , int b){
	base = 0;
	while((1LL << base) <= v[a].size() + v[b].size()) base ++ , nn = (1LL << base);
	REP(i , 0 , nn) w[i] = exp(2 * PI * i / nn * I);
	REP(i , 0 , nn) x[i] = cplx(0 , 0);
	REP(i , 0 , nn) y[i] = cplx(0 , 0);
	REP(i , 0 , v[a].size()) x[i] = v[a][i];
	REP(i , 0 , v[b].size()) y[i] = v[b][i];

	// for(auto to : v[a]) cout << to << " "; cout << endl;
	// for(auto to : v[b]) cout << to << " "; cout << endl;

	// REP(i , 0 , nn) cout << (int)(x[i].real() + 0.5) << " "; cout << endl;
	// REP(i , 0 , nn) cout << (int)(y[i].real() + 0.5) << " "; cout << endl;
	FFT(x) , FFT(y);
	REP(i , 0 , nn) x[i] = x[i] * y[i];
	IFFT(x);
	// REP(i , 0 , nn) cout << (int)(x[i].real() + 0.5) << " "; cout << endl;
	v[a].clear();
	REP(i , 0 , nn) v[a].pb((int)(x[i].real() + 0.5) % mod);
	while(v[a].back() == 0) v[a].pop_back();

}

int n , m , k , a[MAX] , cnt[MAX];
int32_t main(){
	IOS;
	cin >> n >> m >> k;
	REP(i , 1 , n + 1) cin >> a[i];
	REP(i , 1 , n + 1) cnt[a[i]] ++;
	REP(i , 1 , m + 1) v[i].resize(cnt[i] + 1 , 1);
	priority_queue<PII , vector<PII> , greater<PII>> pq;
	REP(i , 1 , m + 1) pq.push(mp(v[i].size() , i));

	while(pq.size() > 1){
		PII a = pq.top(); pq.pop();
		PII b = pq.top(); pq.pop();
		solve(a.B , b.B);
		pq.push(mp(v[a.B].size() , a.B));
	}
	cout << v[pq.top().B][k] << endl;
    return 0;
}


/*input
4 3 2
1 2 3 2
*/
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
#define REP(i,j,k)     for(int i = j ; i < k ; ++i)
#define RREP(i,j,k)    for(int i = j ; i >=k ; --i)
#define A    first
#define B    second
#define mp   make_pair
#define pb   emplace_back
#define PII pair<int , int>
#define MEM(i,j)   memset(i , j , sizeof i)
#define ALL(i)     i.begin() , i.end()
#define DBGG(i,j)     cout << i << " " << j << endl
#define DB4(i,j,k,l)  cout << i << " " << j << " " << k << " " << l << endl
#define IOS cin.tie(0) , cout.sync_with_stdio(0)
#define endl "\n"
///------------------------------------------------------------
#define int long long
#define MAX (1 << 19) + 10
#define INF 0x3f3f3f3f
#define mod 1009
#define cplx complex<double>
const double PI = acos(-1);

vector<int> v[MAX];
cplx tmp[MAX] , x[MAX] , y[MAX] , w[MAX] , I(0 , 1);
int nn , base;
void FFT(cplx now[MAX]){
	int siz = 0 , pat = (nn >> 1) - 1;
	RREP(i , base - 1 , 0){
		REP(j , 0 , nn){
			int fr = j >> i , ba = j & pat;
			int a = ((fr & siz) << 1 | 0) << i | ba;
			int b = ((fr & siz) << 1 | 1) << i | ba;
			tmp[j] = now[a] + now[b] * w[fr << i];
		}
		REP(j , 0 , nn) now[j] = tmp[j];
		siz = (siz << 1 | 1) , pat >>= 1;
	}
}
void IFFT(cplx now[MAX]){
	FFT(now) , reverse(now + 1 , now + nn);
	REP(i , 0 , nn) now[i] /= nn;
}
void solve(int a , int b){
	base = 0;
	while((1LL << base) <= v[a].size() + v[b].size()) base ++;
	if((1LL << base) <= 500){
		vector<int> sol(v[a].size() + v[b].size());
		REP(i , 0 , v[a].size()) REP(j , 0 , v[b].size()) sol[i + j] += v[a][i] * v[b][j];
		REP(i , 0 , sol.size()) sol[i] %= mod;
		v[a] = sol;
		while(v[a].back() == 0) v[a].pop_back();
		return ;
	}
	if((1LL << base) != nn){
		nn = (1LL << base);
		REP(i , 0 , nn) w[i] = exp(2 * PI * i / nn * I);
	}
	REP(i , 0 , nn){
		x[i] = i < v[a].size() ? cplx(v[a][i] , 0) : cplx(0 , 0);
		y[i] = i < v[b].size() ? cplx(v[b][i] , 0) : cplx(0 , 0);
	}
	FFT(x) , FFT(y);
	REP(i , 0 , nn) x[i] = x[i] * y[i];
	IFFT(x);
	v[a].clear();
	REP(i , 0 , nn) v[a].pb((int)(x[i].real() + 0.5) % mod);
	while(v[a].back() == 0) v[a].pop_back();
}

int n , m , k , a[MAX] , cnt[MAX];
int32_t main(){
	IOS;
	cin >> n >> m >> k;
	REP(i , 1 , n + 1) cin >> a[i] , cnt[a[i]] ++;
	REP(i , 1 , m + 1) v[i].resize(cnt[i] + 1 , 1);
	priority_queue<PII , vector<PII> , greater<PII>> pq;
	REP(i , 1 , m + 1) pq.push(mp(v[i].size() , i));

	while(pq.size() > 1){
		PII a = pq.top(); pq.pop();
		PII b = pq.top(); pq.pop();
		solve(a.B , b.B);
		pq.push(mp(v[a.B].size() , a.B));
	}
	cout << v[pq.top().B][k] << endl;
    return 0;
}


/*input
4 3 2
1 2 3 2
*/
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
#define REP(i,j,k)     for(int i = j ; i < k ; ++i)
#define RREP(i,j,k)    for(int i = j ; i >=k ; --i)
#define A    first
#define B    second
#define mp   make_pair
#define pb   emplace_back
#define PII pair<int , int>
#define MEM(i,j)   memset(i , j , sizeof i)
#define ALL(i)     i.begin() , i.end()
#define DBGG(i,j)     cout << i << " " << j << endl
#define DB4(i,j,k,l)  cout << i << " " << j << " " << k << " " << l << endl
#define IOS cin.tie(0) , cout.sync_with_stdio(0)
#define endl "\n"
///------------------------------------------------------------
#define int long long
#define MAX (1 << 19) + 10
#define INF 0x3f3f3f3f
#define mod 1009
#define cplx complex<double>
const double PI = acos(-1);

vector<int> v[MAX];
cplx tmp[MAX] , x[MAX] , y[MAX] , w[MAX] , I(0 , 1);
int nn , base;
void FFT(cplx now[MAX]){
	int siz = 0 , pat = (nn >> 1) - 1;
	RREP(i , base - 1 , 0){
		REP(j , 0 , nn){
			int fr = j >> i , ba = j & pat;
			int a = ((fr & siz) << 1 | 0) << i | ba;
			int b = ((fr & siz) << 1 | 1) << i | ba;
			tmp[j] = now[a] + now[b] * w[fr << i];
		}
		REP(j , 0 , nn) now[j] = tmp[j];
		siz = (siz << 1 | 1) , pat >>= 1;
	}
}
void IFFT(cplx now[MAX]){
	FFT(now) , reverse(now + 1 , now + nn);
	REP(i , 0 , nn) now[i] /= nn;
}
void solve(int a , int b){
	base = 0;
	while((1LL << base) <= v[a].size() + v[b].size()) base ++;
	if((1LL << base) <= 700){
		vector<int> sol(v[a].size() + v[b].size());
		REP(i , 0 , v[a].size()) REP(j , 0 , v[b].size()) sol[i + j] += v[a][i] * v[b][j];
		REP(i , 0 , sol.size()) sol[i] %= mod;
		v[a] = sol;
		while(v[a].back() == 0) v[a].pop_back();
		return ;
	}
	if((1LL << base) != nn){
		nn = (1LL << base);
		REP(i , 0 , nn) w[i] = exp(2 * PI * i / nn * I);
	}
	REP(i , 0 , nn){
		x[i] = i < v[a].size() ? cplx(v[a][i] , 0) : cplx(0 , 0);
		y[i] = i < v[b].size() ? cplx(v[b][i] , 0) : cplx(0 , 0);
	}
	FFT(x) , FFT(y);
	REP(i , 0 , nn) x[i] = x[i] * y[i];
	IFFT(x);
	v[a].clear();
	REP(i , 0 , nn) v[a].pb((int)(x[i].real() + 0.5) % mod);
	while(v[a].back() == 0) v[a].pop_back();
}

int n , m , k , a[MAX] , cnt[MAX];
int32_t main(){
	IOS;
	cin >> n >> m >> k;
	REP(i , 1 , n + 1) cin >> a[i] , cnt[a[i]] ++;
	REP(i , 1 , m + 1) v[i].resize(cnt[i] + 1 , 1);
	priority_queue<PII , vector<PII> , greater<PII>> pq;
	REP(i , 1 , m + 1) pq.push(mp(v[i].size() , i));

	while(pq.size() > 1){
		PII a = pq.top(); pq.pop();
		PII b = pq.top(); pq.pop();
		solve(a.B , b.B);
		pq.push(mp(v[a.B].size() , a.B));
	}
	cout << v[pq.top().B][k] << endl;
    return 0;
}


/*input
4 3 2
1 2 3 2
*/
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
#define REP(i,j,k)     for(int i = j ; i < k ; ++i)
#define RREP(i,j,k)    for(int i = j ; i >=k ; --i)
#define A    first
#define B    second
#define mp   make_pair
#define pb   emplace_back
#define PII pair<int , int>
#define MEM(i,j)   memset(i , j , sizeof i)
#define ALL(i)     i.begin() , i.end()
#define DBGG(i,j)     cout << i << " " << j << endl
#define DB4(i,j,k,l)  cout << i << " " << j << " " << k << " " << l << endl
#define IOS cin.tie(0) , cout.sync_with_stdio(0)
#define endl "\n"
///------------------------------------------------------------
#define int long long
#define MAX (1 << 18) + 10
#define INF 0x3f3f3f3f
#define mod 1009
#define cplx complex<double>
const double PI = acos(-1);

vector<int> v[MAX];
cplx tmp[MAX] , x[MAX] , y[MAX] , w[MAX] , I(0 , 1);
int nn , base , maxn = (1 << 18);
void FFT(cplx now[MAX]){
	int siz = 0 , pat = (nn >> 1) - 1 , mul = maxn / nn;
	RREP(i , base - 1 , 0){
		REP(j , 0 , nn){
			int fr = j >> i , ba = j & pat;
			int a = ((fr & siz) << 1 | 0) << i | ba;
			int b = ((fr & siz) << 1 | 1) << i | ba;
			tmp[j] = now[a] + now[b] * w[(fr << i) * mul];
		}
		REP(j , 0 , nn) now[j] = tmp[j];
		siz = (siz << 1 | 1) , pat >>= 1;
	}
}
void IFFT(cplx now[MAX]){
	FFT(now) , reverse(now + 1 , now + nn);
	REP(i , 0 , nn) now[i] /= nn;
}
void solve(int a , int b){
	base = 0;
	while((1LL << base) <= v[a].size() + v[b].size()) base ++ , nn = (1 << base);

	REP(i , 0 , nn){
		x[i] = i < v[a].size() ? cplx(v[a][i] , 0) : cplx(0 , 0);
		y[i] = i < v[b].size() ? cplx(v[b][i] , 0) : cplx(0 , 0);
	}
	FFT(x) , FFT(y);
	REP(i , 0 , nn) x[i] = x[i] * y[i];
	IFFT(x);

	v[a].clear();
	REP(i , 0 , nn) v[a].pb((int)(x[i].real() + 0.5) % mod);
	while(v[a].back() == 0) v[a].pop_back();
}

int n , m , k , a[MAX] , cnt[MAX];
int32_t main(){
	IOS;
	cin >> n >> m >> k;
	REP(i , 1 , n + 1) cin >> a[i] , cnt[a[i]] ++;
	REP(i , 1 , m + 1) v[i].resize(cnt[i] + 1 , 1);

	REP(i , 0 , maxn) w[i] = exp(2 * PI * i / maxn * I);
	priority_queue<PII , vector<PII> , greater<PII>> pq;
	REP(i , 1 , m + 1) pq.push(mp(v[i].size() , i));
	while(pq.size() > 1){
		PII a = pq.top(); pq.pop();
		PII b = pq.top(); pq.pop();
		solve(a.B , b.B);
		pq.push(mp(v[a.B].size() , a.B));
	}
	cout << v[pq.top().B][k] << endl;
    return 0;
}