#include<bits/stdc++.h>constint N =262144, M =1e7+10, P =1004535809;intri(){char c =getchar();int x =0, f =1;for(;c <'0'|| c >'9'; c =getchar())if(c =='-') f =-1;for(;c >='0'&& c <='9'; c =getchar()) x =(x <<1)+(x <<3)-'0'+ c;return x * f;}int w[N], R[N], A[N], B[N], sz[N], f[M], g[M], v[N], tp, L, InvL, n;intfix(int x){return(x >>31& P)+ x;}intadd(int a,int b){return a += b, a >= P ? a - P : a;}intmul(int a,int b){return1LL* a * b % P;}intPow(int x,int k){int r =1;for(;k; x =mul(x, x), k >>=1)if(k &1)
r =mul(r, x);return r;}intInv(int x){returnPow(x, P -2);}voidPre(int m){
L =1;int x =0;for(;(L <<=1)< m;++x);for(int i =1;i < L;++i)
R[i]= R[i >>1]>>1|(i &1)<< x;
w[0]=1;int wn =Pow(3,(P -1)/ L);for(int i =1;i < L;++i)
w[i]=mul(w[i -1], wn);
InvL =Inv(L);}voidDFT(int*F){for(int i =0;i < L;++i)if(i < R[i])
std::swap(F[i], F[R[i]]);for(int i =1, d = L >>1; i < L; i <<=1, d >>=1)for(int j =0;j < L; j += i <<1){int*l = F + j,*r = F + j + i,*p = w, tp;for(int k = i; k--;++l,++r, p += d)
tp =mul(*r,*p),*r =fix(*l - tp),*l =add(*l, tp);}}intC(int m,int n){returnmul(mul(f[m], g[n]), g[m - n]);}voidGet(int n){
f[0]=1;for(int i =1;i <= n;++i) f[i]=mul(f[i -1], i);
g[n]=Inv(f[n]);for(int i = n;i;--i) g[i -1]=mul(g[i], i);}intmain(){int n =ri(), m =ri(), s =ri(), lim = std::min(n / s, m);for(int i =0;i <= m;++i) v[i]=ri();Get(std::max(n, m));for(int i =0;i <= lim;++i){int cnt = i * s;
A[i]=mul(mul(C(m, i),C(n, cnt)),mul(f[cnt],Pow(g[s], i)));
A[i]=mul(A[i],mul(Pow(m - i, n - cnt), f[i]));}for(int i =0;i <= lim;++i)
B[lim - i]= i &1?fix(-g[i]): g[i];Pre((lim <<1)+1);DFT(A);DFT(B);for(int i =0;i < L;++i)
A[i]=mul(A[i], B[i]);DFT(A);int ans =0;for(int i =0;i <= lim;++i){
ans =add(ans,mul(mul(v[i], g[i]),mul(A[L - i - lim & L -1], InvL)));}printf("%d\n", ans);return0;}