#include using namespace std; const long mod=998244353; const int C=6; int R,rC,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]>R>>rC>>N; int LIM=1; for(int i=0;i=3)<N)continue; for(int m=0;m>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>m&1))unite(m,C+m); if(m+1>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=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;m0) { bool out=false; for(int m=0;m0&&nxt==0) { if(nj==N&&sz==3) { ans+=dp[i][j][k]; if(ans>=mod)ans-=mod; } } else if(i=mod)dp[i+1][nj][nxt]-=mod; } } } } cout<