#include #include #include #include #include #include using namespace std; using namespace atcoder; using ll = long long; using mint = modint998244353; using vi = vector; using vvi = vector; using vvvi = vector; using vll = vector; using vvll = vector; using vvvll = vector; using vmi = vector; using vvmi = vector; using vvvmi = vector; #define all(a) (a).begin(), (a).end() #define rep2(i, m, n) for (int i = (m); i < (n); ++i) #define rep(i, n) rep2(i, 0, n) #define drep2(i, m, n) for (int i = (m)-1; i >= (n); --i) #define drep(i, n) drep2(i, n, 0) void solve(){ } int main(){ int l, k; string s, t; cin >> l >> k >> s >> t; int sum = 0; vi a(26); rep(i, 26){ cin >> a[i]; sum += a[i]; } vmi pr(26); rep(i, 26)pr[i] = mint(a[i])/ mint(sum); vvvmi dp(k+1, vvmi(l, vmi(2*l+1, mint(0)))); dp[0][0][l] = mint(1); rep(i, k){ rep(p, l)rep2(q, 1, 2*l){ if(dp[i][p][q].val() == 0)continue; int diff = q-l; int m = p - diff; if(m < 0)m+= l; int cn = s[p] - 'a', cm = t[m] - 'a'; if(cn == cm){ dp[i+1][p][q] += dp[i][p][q] * (1 - pr[cn]); dp[i+1][(p+1)%l][q] += dp[i][p][q] * pr[cn]; }else{ dp[i+1][p][q] += dp[i][p][q] * (1 - mint(a[cn] + a[cm]/mint(sum))); dp[i+1][(p+1)%l][q+1] += dp[i][p][q] * pr[cn]; dp[i+1][p][q-1] += dp[i][p][q] * pr[cm]; } } } mint nana = mint(0), minsa = mint(0); rep(i, k+1){ rep(j, l){ nana += dp[i][j][2*l]; minsa += dp[i][j][0]; } } cout << nana.val() << " " << minsa.val() << endl; return 0; }