func_code_string: #include <bits/stdc++.h>   using namespace std;   const int maxn = 59;   const long long mod = 998244353;   int add[maxn];   long long w[maxn];   long long dp[52][52][52];   long long val[52][52][52];   bool vis[52][52][52];   long long Pow(long long a, long long b) {     long long res = 1;     a %= mod;     while (b) {       if (b & 1) res = res * a % mod;       b >>= 1;       a = a * a % mod;     }     return res;   }   inline long long inv(long long a) { return Pow(a, mod - 2); }   int flag;   long long dfs(int step, long long p, int i, int j, int k, long long x,                 long long y, long long z) {     if (step == 0) return p * x % mod;     if (vis[i][j][k]) {       return val[i][j][k] * inv(dp[i][j][k]) % mod * p % mod;     }     dp[i][j][k] = p;     val[i][j][k] += dfs(step - 1, p * x % mod * inv(x + y + z) % mod, i + 1, j, k,                         max(0ll, x + flag), y, z);     val[i][j][k] += dfs(step - 1, p * y % mod * inv(x + y + z) % mod, i, j + 1, k,                         x, y + 1, z);     val[i][j][k] += dfs(step - 1, p * z % mod * inv(x + y + z) % mod, i, j, k + 1,                         x, y, max(0ll, z - 1));     val[i][j][k] %= mod;     vis[i][j][k] = 1;     return val[i][j][k];   }   int main() {     int n, m;     scanf( %d%d , &n, &m);     long long ori, s0 = 0, s1 = 0;     for (int i = 1; i <= n; i++) scanf( %d , add + i);     for (int i = 1; i <= n; i++) {       scanf( %lld , w + i);       if (add[i])         s1 += w[i];       else         s0 += w[i];     }     ori = s0 + s1;     int x, y, z, step;     for (int i = 1; i <= n; i++) {       memset(dp, 0, sizeof dp);       memset(val, 0, sizeof val);       memset(vis, 0, sizeof vis);       if (add[i])         flag = 1, val[0][0][0] = dfs(m, 1, 0, 0, 0, w[i], s1 - w[i], s0);       else         flag = -1, val[0][0][0] = dfs(m, 1, 0, 0, 0, w[i], s1, s0 - w[i]);       printf( %lld n , val[0][0][0]);     }   }   