#include<bits/stdc++.h>
using namespace std;
#define fir first
#define sec second
#define m_p make_pair
#define y1 ygftgfgcdtfgxffgx
#define y2 yfdsesgvtyghftfvv
#define x1 xvyr6cf6fgcfgf676
#define x2 xcr6rfc5r66y6r6fr
#define up_bound upper_bound
#define low_bound lower_bound
#define next_per next_permutation
#define pb push_back
#define i_to_s to_string
typedef priority_queue<int> p_queue;
typedef priority_queue<int, vector<int>, greater<int> > min_p_queue;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
int mon[20]={0,31,28,31,30,31,30,31,31,30,31,30,31};
ll gcd(ll x,ll y){return ((y==0)?x:gcd(y,x%y));}
inline int read(){
char ch=getchar();int num=0;bool flag=false;
while(ch<'0'||ch>'9'){if(ch=='-')flag=true;ch=getchar();}
while(ch>='0'&&ch<='9'){num=num*10+ch-'0';ch=getchar();}
return flag?-num:num;
}
int n,m,k;
const int mod=998244353;
ll v[50];
ll dp[50][1<<18];
ll mask;
int dfs(int step,ll var){
if(dp[step][mask]!=-1)return dp[step][mask];
if(step==n){
if(bitset<64>(mask).count()<=k){
dp[step][mask]=var;
return dp[step][mask];
}else return dp[step][mask]=-2;
}
ll sum=0;bool flag=0;
for(int i=0;i<=m;i++){
ll mas=mask;
mask=mask+(1<<i);
ll va=dfs(step+1,(var*v[i])%mod);
if(va>=0){
sum+=va;
flag=1;
sum%=mod;
}
mask=mas;
}
if(flag){
dp[step][mask]=sum;
}else dp[step][mask]=-2;
return dp[step][mask];
}
void solve(){
cin>>n>>m>>k;
for(int i=0;i<=m;i++){
cin>>v[i];
}mask=0;
memset(dp,-1,sizeof dp);
cout<<dfs(0,1);
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
int t;
t=1;
while(t--)
solve();
return 0;
}