тема Портал
Теперь BZOJ администратор еще не работал, CTS (C) 2019 и при условии NOI2019 до сих пор не пройти.
Конечно же, или LOJ хорошо.
титульный
Именно \ (к \) большое количество очень хороший спрос, мы преобразовали в биномиальной инверсии.
Тогда становится дано множество точек \ (S \) , ищет Imperial \ (S \) программы является количество точек максимальной точки. Может быть найден в \ (S \) в точке из - за необходимости обеспечения того , чтобы нет одномерные координаты одного и того же, так что точка в конце концов, не важно, полезно только \ (| S | \) . Таким образом, вопрос в Императорском (к \) \ число точек должна быть максимальной точкой программы.
Мы можем найти природу, если мы помещаем все числа от малых до большой максимальной точки рассмотрения, то каждые выборы закончили и нынешнюю цифровую поверхности , связанные с точкой позже, как все остальные номера на месте реальных механизмов на \ ((N-1) \ раз (м-1) \ раз (L-1), к-1 \) суб-проблема.
Нам необходимо избрать \ (\ к) отобранный нашей точке расположения , они не должны удовлетворять одномерные координаты одинаковы, так что, очевидно , \ (\ БИНОМ пк \ БИНОМ тк \ БИНОМ лк (К! ) ^ 3 \) . Что же касается , почему расположения, говорит он, только малые к большому рассмотрению, только для удовлетворения вышеуказанных свойств.
Тогда мы должны быть наши избрано \ (к \) точки , расположенные на всех сторонах всех позиций, все позиции остальных цифровых механизмов. Остальные \ (nml- (п) (тк ) (лк) \) хорошо организованы, начиная со всеми \ (NML \) число выбранных из так много, а затем свободно расположены вокруг достаточно. Это \ (\ БИНОМ NML {} {(NK) (MK) (LK)} ((NK) (MK) (LK))! \) .
Основная трудность заключается в избрано \ (K \) число точек , где поверхность. Мы имеем \ (НМК - (пк) ( ки) (Л.К.) \) цифровую альтернативу. Потому что мы в порядке возрастания, так что номер на последнюю выборную должность должен быть самым большим. В то же время, он заберет \ ((п + 1) ( ки + 1) (лк + 1) - (п) (ки) (лк) \) окончательное голосование за него , когда ребенок куб в одной и той же плоскости и цифры. В этом случае, потому что это самый крупный, поэтому независимо от того, что выборы будут не влияют на выбор числа предыдущего местоположения. Таким образом , она имеет \ (\ гидроразрыв {(nml- ( пк) (ки) (лк) -1)!} {(Nml- (п + 1) (MK + 1) (Lk + 1) )!} \) метод выбора.
Затем после выборов закончится, предпоследний номер на позиции , чтобы быть избранным, остальные цифры должны быть наибольшими. В общей сложности количество оставшихся \ (nml- (п-к + 1) (т-к + 1) (л-к + 1) \) вида, а затем так же , как до последнего считали.
Поэтому выбирают так, чтобы быть \ (К \) Общее количество точек , расположенных цифровой схемы лица , где
\ [\ prod_ {= 1 } ^ к \ гидроразрыва {(nml- (п) (ми) (Li) -1)!} {(nml- (
п-г + 1) (т-г + 1) (л-г + 1))!} \] могут быть найдены на части факториала мы можем исключить, так что
\ [(nml- (пк) (тк ) (лк) -1)! \ prod_ {= 1} ^ {K-1} \ гидроразрыва 1 {(nml- (п-г + 1) (м-+ 1 ) (л-г + 1)
)} \] Таким образом , вышеупомянутые вещи , все вместе, а Империал \ (к \) точки должны быть максимально точка номера программы
\ [\ БИНОМ пк \ БИНОМ тк \ БИНОМ лк (к!) ^ 3 \ БИНОМ {NML} {(п) (ки) (лк)} ((п) (ки) (лк))! (nml- (п) (ки) (лк) -1)! \ prod_ {я = 1} ^ {к-1} \ гидроразрыва 1 {(nml- (п-г + 1) (т-г + 1) (л-г + 1))} \]
\ [= \ БИНОМ пк \ БИНОМ тк \ БИНОМ лк (к!) ^ 3 \ гидроразрыва {(NML)!} {((П) (тк) (лк))! (Nml- (п) (тк) (лк ))!} ((пк) (тк) (лк))! (nml- (пк) (тк) (лк) -1)! \ prod_ {= 1} ^ {K-1} \ гидроразрыва 1 {( nml- (п-г + 1) (т-г + 1) (л-г + 1))} \]
\ [= \ БИНОМ пк \ БИНОМ тк \ БИНОМ лк (к!) ^ 3 {(NML)!} \ Prod_ {= 1} ^ {к} \ гидроразрыва 1 {(nml- (п-г + 1) ( м-г + 1) (л
-i + 1))} \] порядка \ (F (K) \) равно выше , что Империал (к \) \ точка должна быть максимальной точкой номера программы, \ (G (К) \) представляет собой именно то \ (К \) несколько точек программы, то , очевидно ,
\ [F (K) = \
sum_ {я = к} ^ п \ БИНОМ IKG (я) \] так , прямой биномиальное инверсия на нем.
Поскольку ожидается , что спрос, и , наконец , не забудьте избавиться от \ ((NML)! \) .
Вот код. \ (\ Прод \ limits_ {я = 1} ^ {к} \ гидроразрыва 1 {(nml- (п-г + 1) (т-г + 1) (л-г + 1))} \) может быть предварительно линейной процесс, таким образом, общая сложность времени \ (O (п) \) .
#include<bits/stdc++.h>
#define fec(i, x, y) (int i = head[x], y = g[i].to; i; i = g[i].ne, y = g[i].to)
#define dbg(...) fprintf(stderr, __VA_ARGS__)
#define File(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout)
#define fi first
#define se second
#define pb push_back
template<typename A, typename B> inline char smax(A &a, const B &b) {return a < b ? a = b , 1 : 0;}
template<typename A, typename B> inline char smin(A &a, const B &b) {return b < a ? a = b , 1 : 0;}
typedef long long ll; typedef unsigned long long ull; typedef std::pair<int, int> pii;
template<typename I>
inline void read(I &x) {
int f = 0, c;
while (!isdigit(c = getchar())) c == '-' ? f = 1 : 0;
x = c & 15;
while (isdigit(c = getchar())) x = (x << 1) + (x << 3) + (c & 15);
f ? x = -x : 0;
}
const int N = 5e6 + 7;
const int P = 998244353;
int n, m, l, k;
int a[N], s[N], f[N];
inline int smod(int x) { return x >= P ? x - P : x; }
inline void sadd(int &x, const int &y) { x += y; x >= P ? x -= P : x; }
inline int fpow(int x, int y) {
int ans = 1;
for (; y; y >>= 1, x = (ll)x * x % P) if (y & 1) ans = (ll)ans * x % P;
return ans;
}
int fac[N], inv[N], ifac[N];
inline void ycl(const int &n = ::n) {
fac[0] = 1; for (int i = 1; i <= n; ++i) fac[i] = (ll)fac[i - 1] * i % P;
inv[1] = 1; for (int i = 2; i <= n; ++i) inv[i] = (ll)(P - P / i) * inv[P % i] % P;
ifac[0] = 1; for (int i = 1; i <= n; ++i) ifac[i] = (ll)ifac[i - 1] * inv[i] % P;
}
inline int C(int x, int y) {
if (x < y) return 0;
return (ll)fac[x] * ifac[y] % P * ifac[x - y] % P;
}
inline void work() {
ycl(std::max(m, l));
int nml = (ll)n * m % P * l % P, ii = 1;
a[0] = 1;
for (int i = 1; i <= n; ++i) a[i] = (nml + P - (ll)(n - i) * (m - i) % P * (l - i) % P) % P, ii = (ll)ii * a[i] % P;
ii = fpow(ii, P - 2);
for (int i = n; i; --i) s[i] = ii, ii = (ll)ii * a[i] % P;
for (int i = 1; i <= n; ++i) f[i] = (ll)C(n, i) * C(m, i) % P * C(l, i) % P * fpow(fac[i], 3) % P * s[i] % P;
int ans = 0;
for (int i = k; i <= n; ++i)
if ((i - k) & 1) sadd(ans, P - (ll)C(i, k) * f[i] % P);
else sadd(ans, (ll)C(i, k) * f[i] % P);
printf("%d\n", ans);
}
inline void init() {
read(n), read(m), read(l), read(k);
if (n > m) std::swap(n, m);
if (n > l) std::swap(n, l);
}
int main() {
#ifdef hzhkk
freopen("hkk.in", "r", stdin);
#endif
int T;
read(T);
while (T--) {
init();
work();
}
fclose(stdin), fclose(stdout);
return 0;
}