#include #include #include #include using namespace std; #include template struct Matrix{ array,N>dat; array&operator[](int i){return dat[i];} const array&operator[](int i)const{return dat[i];} Matrix(){for(int i=0;i>=1)if(n&1)res=res*a; return res; } }; using mint=atcoder::modint998244353; int N,M,K; mapmemo; mint GO(long T) { if(T<0)return mint::raw(0); if(memo.find(T)!=memo.end())return memo[T]; MatrixA; 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; MatrixT; 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"; } }