#include<iostream> #include<map> #include<cassert> #include<atcoder/modint> using namespace std; #include<array> template<typename T,unsigned int N> struct Matrix{ array<array<T,N>,N>dat; array<T,N>&operator[](int i){return dat[i];} const array<T,N>&operator[](int i)const{return dat[i];} Matrix(){for(int i=0;i<N;i++)dat[i].fill(T(0));} static Matrix eye(){ Matrix res; for(int i=0;i<N;i++)res[i][i]=1; return res; } Matrix operator+(const Matrix&A)const{ Matrix res; for(int i=0;i<N;i++)for(int j=0;j<N;j++) res[i][j]=dat[i][j]+A[i][j]; return res; } Matrix operator*(const Matrix&A)const{ Matrix res; for(int i=0;i<N;i++)for(int k=0;k<N;k++)for(int j=0;j<N;j++) res[i][j]+=dat[i][k]*A[k][j]; return res; } Matrix pow(long long n)const{ Matrix a=*this,res=eye(); for(;n;a=a*a,n>>=1)if(n&1)res=res*a; return res; } }; using mint=atcoder::modint998244353; int N,M,K; map<long,mint>memo; mint GO(long T) { if(T<0)return mint::raw(0); if(memo.find(T)!=memo.end())return memo[T]; Matrix<mint,6>A; for(int i=0;i<5;i++)A[i+1][i]=mint::raw(1); for(int i=0;i<6;i++)A[0][i]=mint::raw(1); A=A.pow(T); return memo[T]=A[0][0]; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin>>N>>M>>K; mint ALL=0; for(int y=1;y<=6;y++)ALL+=GO((long)N*M-y)*(6-y+1); for(;K--;) { int C;cin>>C; Matrix<mint,5>T; for(int i=0;i<5;i++)for(int x=1;x<=6;x++) { int from=C-i-1+x; if(from<=C)continue; for(int j=0;j<5;j++) { int to=C-j-1+N; T[j][i]+=GO(to-from); } } T=T.pow(M-1); mint ans=0; for(int i=0;i<5;i++)for(int j=0;j<5;j++) { mint v=T[j][i]*GO(C-i-1); for(int x=1;x<=6;x++) { int to=C-j-1+x; if(to<=C)continue; if(to>=N)ans+=v; else { for(int y=1;y<=6;y++)if(to<=N-y)ans+=v*GO(N-y-to)*(6-y+1); } } } cout<<(ALL-ans).val()<<"\n"; } }