. LOJ3119 "CTS2019 | CTSC2019" куб бином случайной инверсии

тема Портал

https://loj.ac/problem/3119

Теперь 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;
}

рекомендация

отwww.cnblogs.com/hankeke/p/LOJ3119.html
рекомендация