#include<bits/stdc++.h> usingnamespacestd; #define pb push_back constint P = 998244353; intread(){ int s = 0, ne = 1; char c = getchar(); for(;c < '0' || c > '9';c = getchar()) if(c == '-') ne = -1; for(;c >= '0' && c <= '9';c = getchar()) s = (s << 1) + (s << 3) + c - '0'; return s * ne; } intadd(int x, int y){return x + y >= P ? x + y - P : x + y;} intqp(int a, int b){ int r = 1; while(b){ if(b & 1) r = 1ll * r * a % P; a = 1ll * a * a % P, b >>= 1; } return r; } intinvx(int x){return qp(x, P - 2);} boolin(int x, int y){return y & (1 << (x - 1));} intbits(int x){int r = 0; while(x) r++, x -= x & (-x); return r;} int n, q, rt; vector<int> G[20]; int k[20], b[20], f[1 << 18]; voiddfs(int u, int p, int S){ if(in(u, S)) return; int deg = G[u].size(), sb = 0, sk = 0, M; for(int i = 0; i < deg; i++){ int v = G[u][i]; if(v == p) continue; dfs(v, u, S), sb = add(sb, b[v]), sk = add(sk, k[v]); } M = add(deg, P - sk), k[u] = invx(M), b[u] = 1ll * k[u] * add(deg, sb) % P; } intcal(int S){ memset(k, 0, sizeof(k)), memset(b, 0, sizeof(b)); return dfs(rt, 0, S), b[rt]; } intmain() { // freopen("_in.in", "r", stdin); n = read(), q = read(), rt = read(); for(int i = 1; i < n; i++){ int u = read(), v = read(); G[u].pb(v), G[v].pb(u); } for(int S = 1; S < (1 << n); S++){ f[S] = cal(S); f[S] = bits(S) & 1 ? f[S] : add(0, P - f[S]); } for(int j = 0; j < n; j++) for(int S = 0; S < (1 << n); S++) if(S & (1 << j)) f[S] = add(f[S], f[S ^ (1 << j)]); while(q--){ int m = read(), u, S = 0; while(m--) u = read() - 1, S |= 1 << u; printf("%d\n", f[S]); } return0; }
#include<bits/stdc++.h> usingnamespacestd; constint CN = 1e4 + 10; constint P = 998244353; intread(){ int s = 0, ne = 1; char c = getchar(); for(;c < '0' || c > '9';c = getchar()) if(c == '-') ne = -1; for(;c >= '0' && c <= '9';c = getchar()) s = (s << 1) + (s << 3) + c - '0'; return s * ne; } intadd(int x, int y){return x + y >= P ? x + y - P : x + y;} int n, K, m, f[CN][20], p[CN], inv[CN]; intmain() { // freopen("_in.in", "r", stdin); n = 1e4, inv[1] = 1; for(int i = 2; i <= n; i++) inv[i] = 1ll * inv[P % i] * (P - P / i) % P; n = read(), K = n - read() + 1, m = read(); for(int i = 1; i <= n; i++) p[i] = read(); f[0][0] = 1; for(int i = 1; i <= n; i++){ for(int j = m; j >= p[i]; j--) for(int k = K; k; k--) f[j][k] = add(f[j][k], add(f[j - p[i]][k - 1], P - f[j - p[i]][k])); } int ans = 0; for(int j = 1; j <= m; j++) ans = add(ans, 1ll * m * inv[j] % P * f[j][K] % P); printf("%d\n", ans); return0; }