voidinitsti(int N) { poly a(N + 1), b(N + 1); for (int i = 0; i <= N; ++ i) if (i & 1) a[i] = Mod - infact[i]; else a[i] = infact[i]; for (int i = 0; i <= N; ++ i) b[i] = (LL) qpow(i, N) * infact[i] % Mod; sti = a * b; }
inlineintC(int n, int m){ return n < m || n < 0 ? 0 : (LL) fact[n] * infact[m] % Mod * infact[n - m] % Mod; }
intmain() { int n, m, T, L, k; std::cin >> n >> m >> T >> L; initfact(n), initsti(L); while (T --) { scanf("%d %d %d", &n, &m, &k); int res = 0; for (int j = 1, ed = std::min(L, k); j <= ed; ++ j) res = (res + (LL) C(m, j) * fact[j] % Mod * sti[j] % Mod * C(n - j, k - j)) % Mod; res = (LL) res * qpow(C(n, k)) % Mod; printf("%d\n", res); } return0; }