#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define ll long long
using namespace std;
int ni[1100];
int t,m,n,cnt=0;
int id[20][20][20]={};
ll mod=998244353;
struct node
{
int s[167][167];
inline void cleann(){memset(s,0,sizeof(s));}
inline node operator *(const node &y)const
{
node z;
for(int i=1;i<=cnt;i++)
{
for(int j=1;j<=cnt;j++)
{
__int128 tt=0;
for(int k=1;k<=cnt;k++)
{
if(s[i][k]&&y.s[k][j])tt+=1ll*s[i][k]*y.s[k][j];
}
z.s[i][j]=tt%mod;
}
}
return z;
}
}p[100];
inline ll rd()
{
ll s=0;char x='x';
while(x<'0'||x>'9')x=getchar();
while(x>='0'&&x<='9'){s=s*10+(x^48);x=getchar();}
return s;
}
void exgcd(int a,int b,int &x,int &y)
{
if(b==0)x=1,y=0;
else exgcd(b,a%b,y,x),y-=a/b*x;
}
inline int getni(int a,int p)
{
int x,y;
exgcd(a,p,x,y);
return (x%p+p)%p;
}
inline void print(ll s)
{
int l=0;char a[100];
do
{
a[++l]=s%10+'0';
s/=10;
}while(s);
while(l)putchar(a[l--]);
putchar('\n');
}
int main()
{
t=rd();m=rd();n=rd();
for(int i=1;i<=100;i++)ni[i]=getni(i,mod);
for(int i=0;i<=n;i++)
{
for(int j=0;j<=(m>=2?n-i:0);j++)
{
for(int k=0;k<=(m==3?n-i-j:0);k++)
{
id[i][j][k]=++cnt;
}
}
}
++cnt;p[0].s[cnt][cnt]=1;
for(int i=0;i<=n;i++)
{
for(int j=0;j<=(m>=2?n-i:0);j++)
{
for(int k=0;k<=(m>=3?n-i-j:0);k++)
{
int pos=id[i][j][k],iv=ni[i+j+k+1],add=i+j+k<n;
if(m==1)
{
if(i)p[0].s[pos][id[i-1][j][k]]=(1ll*i*iv)%mod;
}
else if(m==2)
{
if(i)p[0].s[pos][id[i-1][j][k]]=(1ll*i*iv)%mod;
if(j)p[0].s[pos][id[i+1][j-1+add][k]]=(1ll*j*iv)%mod;
}
else if(m==3)
{
if(i)p[0].s[pos][id[i-1][j][k]]=(1ll*i*iv)%mod;
if(j)p[0].s[pos][id[i+1][j-1][k+add]]=(1ll*j*iv)%mod;
if(k)p[0].s[pos][id[i][j+1][k-1+add]]=(1ll*k*iv)%mod;
}
p[0].s[pos][pos]=p[0].s[pos][cnt]=iv;
}
}
}
for(int i=1;i<=90;i++)p[i]=p[i-1]*p[i-1];
ll a;
for(int i=1;i<=t;i++)
{
a=rd();
node ans;ans.cleann();
ans.s[1][id[m==1][m==2][m==3]]=1;
for(ll j=0;a;j++)
{
if(a&1)ans=ans*p[j];
a>>=1;
}
print(ans.s[1][cnt]);
}
return 0;
}