Submission #61640278


Source Code Expand

#include <bits/stdc++.h>
#ifdef LOCAL
#include <debug.hpp>
#else
#define debug(...) void(0)
#endif

template <class T, class U = T> bool chmin(T& x, U&& y) {
    return y < x and (x = std::forward<U>(y), true);
}

template <class T, class U = T> bool chmax(T& x, U&& y) {
    return x < y and (x = std::forward<U>(y), true);
}

template <class T> void mkuni(std::vector<T>& v) {
    std::ranges::sort(v);
    auto result = std::ranges::unique(v);
    v.erase(result.begin(), result.end());
}

template <class T> int lwb(const std::vector<T>& v, const T& x) {
    return std::distance(v.begin(), std::ranges::lower_bound(v, x));
}

#include <atcoder/modint>

template <typename T> struct Binomial {
    Binomial(int MAX = 0) : n(1), facs(1, T(1)), finvs(1, T(1)), invs(1, T(1)) {
        assert(T::mod() != 0);
        if (MAX > 0) extend(MAX + 1);
    }

    T fac(int i) {
        assert(i >= 0);
        while (n <= i) extend();
        return facs[i];
    }

    T finv(int i) {
        assert(i >= 0);
        while (n <= i) extend();
        return finvs[i];
    }

    T inv(int i) {
        assert(i >= 0);
        while (n <= i) extend();
        return invs[i];
    }

    T P(int n, int r) {
        if (n < r or r < 0) return 0;
        return fac(n) * finv(n - r);
    }

    T C(int n, int r) {
        if (n < r or r < 0) return 0;
        return fac(n) * finv(n - r) * finv(r);
    }

    T H(int n, int r) {
        if (n < 0 or r < 0) return 0;
        return r == 0 ? 1 : C(n + r - 1, r);
    }

    T negative_binom(int n, int k) { return H(k, n); }

    T C_naive(int n, int r) {
        if (n < r or r < 0) return 0;
        T res = 1;
        r = std::min(r, n - r);
        for (int i = 1; i <= r; i++) res *= inv(i) * (n--);
        return res;
    }

    T catalan(int n) {
        if (n < 0) return 0;
        return fac(2 * n) * finv(n + 1) * finv(n);
    }

    T catalan_pow(int n, int k) {
        if (n < 0 or k < 0) return 0;
        if (k == 0) return n == 0 ? 1 : 0;
        return inv(n + k) * k * C(2 * n + k - 1, n);
    }

    T calatan1(int n, int m) { return C(n + m, m) - C(n + m, m - 1); }

    T catalan2(int n, int m, int k) { return n - m <= -k ? 0 : C(n + m, m) - C(n + m, m - k); }

    T narayana(int n, int k) {
        if (n < k or k <= 0) return 0;
        return C(n, k) * C(n, k - 1) * inv(n);
    }

    T grid_sum(int x, int y) {
        if (x < 0 or y < 0) return 0;
        return C(x + y + 2, x + 1) - 1;
    }

    T grid_sum2(int xl, int xr, int yl, int yr) {
        if (xl >= xr or yl >= yr) return 0;
        xl--, xr--, yl--, yr--;
        return grid_sum(xr, yr) - grid_sum(xl, yr) - grid_sum(xr, yl) + grid_sum(xl, yl);
    }

  private:
    int n;
    std::vector<T> facs, finvs, invs;

    inline void extend(int m = -1) {
        if (m == -1) m = n * 2;
        m = std::min(m, T::mod());
        if (n >= m) return;
        facs.resize(m);
        finvs.resize(m);
        invs.resize(m);
        for (int i = n; i < m; i++) facs[i] = facs[i - 1] * i;
        finvs[m - 1] = T(1) / facs[m - 1];
        invs[m - 1] = finvs[m - 1] * facs[m - 2];
        for (int i = m - 2; i >= n; i--) {
            finvs[i] = finvs[i + 1] * (i + 1);
            invs[i] = finvs[i] * facs[i - 1];
        }
        n = m;
    }
};

using namespace std;

using ll = long long;

using mint = atcoder::modint998244353;
Binomial<mint> BINOM;

void solve() {
    int N, a, b;
    cin >> N >> a >> b;
    a--, b--;

    vector<mint> pow2(N + 1), pow4(N + 1);
    pow2[0] = pow4[0] = 1;
    for (int i = 0; i < N; i++) {
        pow2[i + 1] = pow2[i] * 2;
        pow4[i + 1] = pow4[i] * 4;
    }
    vector<mint> ans(N, 0);
    mint E = 0, F = 0;
    for (int i = N - 1; i >= 0; i--) {
        // これまでに N - 1 - i 枚置いた
        // [x or y] = [0 or i] が条件
        if (i == 0) {
            ans[i] = BINOM.C(N - 1 - i, a) * BINOM.C(N - 1 - i, b);
        } else {
            auto A = BINOM.C(N - 1 - i, a), B = BINOM.C(N - 1 - i, b), C = BINOM.C(N - 1 - i, a - i),
                 D = BINOM.C(N - 1 - i, b - i);
            if (i == N - 1) {
                for (int j = 0; j <= i; j++) {
                    E += BINOM.C(N - 1 - i, a - j);
                    F += BINOM.C(N - 1 - i, b - j);
                }
            }
            ans[i] += (A + C) * F * 2;
            ans[i] += (B + D) * E * 2;
            ans[i] -= (A + C) * (B + D);
            ans[i] *= pow4[i - 1];
            E *= 2;
            E -= BINOM.C(N - 1 - i, a) + BINOM.C(N - 1 - i, a - i);
            F *= 2;
            F -= BINOM.C(N - 1 - i, b) + BINOM.C(N - 1 - i, b - i);
        }
    }

    int Q;
    cin >> Q;
    for (; Q--;) {
        int k;
        cin >> k;
        cout << ans[--k].val() << "\n";
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout << fixed << setprecision(15);

    solve();
    return 0;
}

Submission Info

Submission Time
Task B - L Partition
User rniya
Language C++ 23 (gcc 12.2)
Score 800
Code Size 4905 Byte
Status AC
Exec Time 824 ms
Memory 349864 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 800 / 800
Status
AC × 3
AC × 44
Set Name Test Cases
Sample 01_sample_01.txt, 01_sample_02.txt, 01_sample_03.txt
All 01_sample_01.txt, 01_sample_02.txt, 01_sample_03.txt, 02_small_01.txt, 02_small_02.txt, 02_small_03.txt, 02_small_04.txt, 02_small_05.txt, 02_small_06.txt, 02_small_07.txt, 02_small_08.txt, 02_small_09.txt, 02_small_10.txt, 02_small_11.txt, 02_small_12.txt, 02_small_13.txt, 02_small_14.txt, 03_rand_1_01.txt, 03_rand_1_02.txt, 03_rand_1_03.txt, 03_rand_1_04.txt, 03_rand_1_05.txt, 04_rand_2_01.txt, 04_rand_2_02.txt, 04_rand_2_03.txt, 04_rand_2_04.txt, 04_rand_2_05.txt, 05_rand_3_01.txt, 05_rand_3_02.txt, 05_rand_3_03.txt, 05_rand_3_04.txt, 05_rand_3_05.txt, 06_XY_special_01.txt, 06_XY_special_02.txt, 06_XY_special_03.txt, 06_XY_special_04.txt, 06_XY_special_05.txt, 06_XY_special_06.txt, 06_XY_special_07.txt, 06_XY_special_08.txt, 06_XY_special_09.txt, 06_XY_special_10.txt, 06_XY_special_11.txt, 06_XY_special_12.txt
Case Name Status Exec Time Memory
01_sample_01.txt AC 1 ms 3440 KiB
01_sample_02.txt AC 1 ms 3604 KiB
01_sample_03.txt AC 1 ms 3424 KiB
02_small_01.txt AC 1 ms 3396 KiB
02_small_02.txt AC 1 ms 3484 KiB
02_small_03.txt AC 1 ms 3412 KiB
02_small_04.txt AC 1 ms 3420 KiB
02_small_05.txt AC 1 ms 3468 KiB
02_small_06.txt AC 1 ms 3392 KiB
02_small_07.txt AC 1 ms 3320 KiB
02_small_08.txt AC 1 ms 3604 KiB
02_small_09.txt AC 1 ms 3408 KiB
02_small_10.txt AC 1 ms 3416 KiB
02_small_11.txt AC 1 ms 3448 KiB
02_small_12.txt AC 1 ms 3420 KiB
02_small_13.txt AC 1 ms 3452 KiB
02_small_14.txt AC 1 ms 3460 KiB
03_rand_1_01.txt AC 32 ms 8964 KiB
03_rand_1_02.txt AC 33 ms 9000 KiB
03_rand_1_03.txt AC 31 ms 9000 KiB
03_rand_1_04.txt AC 33 ms 8968 KiB
03_rand_1_05.txt AC 32 ms 9072 KiB
04_rand_2_01.txt AC 401 ms 172160 KiB
04_rand_2_02.txt AC 468 ms 193284 KiB
04_rand_2_03.txt AC 489 ms 197948 KiB
04_rand_2_04.txt AC 127 ms 51316 KiB
04_rand_2_05.txt AC 510 ms 204324 KiB
05_rand_3_01.txt AC 786 ms 348996 KiB
05_rand_3_02.txt AC 796 ms 349488 KiB
05_rand_3_03.txt AC 804 ms 349408 KiB
05_rand_3_04.txt AC 815 ms 349608 KiB
05_rand_3_05.txt AC 801 ms 349004 KiB
06_XY_special_01.txt AC 786 ms 349836 KiB
06_XY_special_02.txt AC 806 ms 349704 KiB
06_XY_special_03.txt AC 775 ms 349860 KiB
06_XY_special_04.txt AC 800 ms 349840 KiB
06_XY_special_05.txt AC 783 ms 349756 KiB
06_XY_special_06.txt AC 795 ms 349780 KiB
06_XY_special_07.txt AC 780 ms 349840 KiB
06_XY_special_08.txt AC 801 ms 349860 KiB
06_XY_special_09.txt AC 773 ms 349840 KiB
06_XY_special_10.txt AC 787 ms 349844 KiB
06_XY_special_11.txt AC 824 ms 349808 KiB
06_XY_special_12.txt AC 777 ms 349864 KiB