#include #include #include using namespace atcoder; using mint = modint998244353; using namespace std; #define rep(i,n) for (int i = 0; i < (n); ++i) #define Inf32 1000000001 #define Inf64 1000000000000000001 auto get(vector a,vector b,vector f){ int n = a.size(); vector dp(n+1,vector(9,vector(5,vector(34,0)))); dp[0][0][0][0] = 1; rep(i,n){ rep(j,9){ rep(k,5){ rep(l,34){ dp[i+1][j][k][l] += dp[i][j][k][l]; if(f[i])continue; int nj = j+1,nk = k + a[i],nl = l+b[i]; if(nj<9&&nk<5&&nl<34){ dp[i+1][nj][nk][nl] += dp[i][j][k][l]; } } } } } return dp; } int main(){ int n; cin>>n; vector a(n); rep(i,n)cin>>a[i]; vector b(n); vector f(n,false); rep(i,n){ string t; cin>>t; t.insert(t.begin(),'0'); if(t[t.size()-1]=='X'){ f[i] = true; t.pop_back(); } b[i] = stoi(t); } auto x = get(a,b,f); reverse(a.begin(),a.end()); reverse(b.begin(),b.end()); reverse(f.begin(),f.end()); auto y = get(a,b,f); reverse(a.begin(),a.end()); reverse(b.begin(),b.end()); reverse(f.begin(),f.end()); mint ans = 0; rep(i,n){ rep(j,9){ rep(k,5){ rep(l,34){ if(k+a[i]>=5||l+b[i]>=34)continue; mint v = x[i][j][k][l] * y[n-1-i][8-j][4-k-a[i]][33-l-b[i]]; //cout<