#include<iostream> using namespace std; const long mod=998244353; int R,C,N; long dp[55][51][46656]; int ufpr[20],ufsz[20]; inline int find(int u){return ufpr[u]!=u?ufpr[u]=find(ufpr[u]):u;} inline void unite(int a,int b) { a=find(a),b=find(b); if(a!=b) { if(ufsz[a]<ufsz[b]) { ufpr[a]=b; ufsz[b]+=ufsz[a]; } else { ufpr[b]=a; ufsz[a]+=ufsz[b]; } } } int v[2][6],pr[2][6],mp[18]; main() { cin>>R>>C>>N; int LIM=1; for(int i=0;i<C;i++)LIM*=6; dp[0][0][0]=1; long ans=0; for(int i=0;i<=R;i++) { for(int j=0;j<N;j+=2)for(int k=0;k<LIM;k++)if(dp[i][j][k]!=0) { int t[6],kl=0; { int u=k; for(int l=0;l<C;l++) { t[l]=u%6; kl|=(t[l]>=3)<<l; u/=6; } } for(int l=0;l<1<<C;l++) { int nl=kl^l; int nj=j+__builtin_popcount(nl^nl<<1); if(nj>N)continue; for(int m=0;m<C;m++) { v[0][m]=t[m]; v[1][m]=l>>m&1?3:1; } for(int m=0;m<18;m++)ufpr[m]=m,ufsz[m]=1,mp[m]=0; if(v[1][0]==1)v[1][0]=0,unite(C,2*C); if(v[1][C-1]==1)v[1][C-1]=0,unite(2*C-1,2*C); for(int m=0;m<C;m++) { if(!(nl>>m&1))unite(m,C+m); if(m+1<C&&(l>>m&1)==(l>>m+1&1))unite(C+m,C+m+1); unite(m,2*C+v[0][m]); } for(int id=0;id<2;id++)for(int m=0;m<C;m++)pr[id][m]=find(id*C+m); mp[find(2*C)]=-1; int sz=2,tsz=0; for(int id=0;id<2;id++)for(int m=0;m<C;m++) { int t=pr[id][m]; if(v[id][m]>=3) { if(mp[t]==0)mp[t]=++sz; } else { if(v[id][m]>0&&mp[t]==0)mp[t]=++tsz; } } if(sz>=6||tsz>=3)continue; for(int id=0;id<2;id++)for(int m=0;m<C;m++) { int t=pr[id][m]; if(mp[t]==-1)v[id][m]=0; else v[id][m]=mp[t]; } if(l>0) { bool out=false; for(int m=0;m<C;m++)mp[pr[1][m]]=-3; mp[find(2*C)]=-3; for(int m=0;m<C;m++) { if(mp[pr[0][m]]!=-3) { out=true; break; } } if(out)continue; } int nxt=0; for(int m=C;m--;)nxt=nxt*6+v[1][m]; if(k>0&&nxt==0) { if(nj==N&&sz==3) { ans+=dp[i][j][k]; if(ans>=mod)ans-=mod; } } else if(i<R) { dp[i+1][nj][nxt]+=dp[i][j][k]; if(dp[i+1][nj][nxt]>=mod)dp[i+1][nj][nxt]-=mod; } } } } cout<<ans<<endl; }