Submission #49554632


Source Code Expand

#include <bits/stdc++.h>

typedef long long valueType;
typedef std::vector<valueType> ValueVector;
typedef std::vector<ValueVector> ValueMatrix;
typedef std::vector<ValueMatrix> ValueCube;
typedef std::string string;
typedef std::vector<string> StringVector;
typedef std::vector<bool> bitset;
typedef std::vector<bitset> BitMatrix;
typedef std::pair<valueType, valueType> ValuePair;
typedef std::vector<ValuePair> PairVector;
typedef std::vector<PairVector> PairMatrix;
typedef std::tuple<valueType, valueType, valueType> ValueTuple;
typedef std::vector<ValueTuple> TupleVector;
typedef std::vector<TupleVector> TupleMatrix;
typedef std::set<valueType> ValueSet;

namespace MODINT_WITH_FIXED_MOD {
    constexpr valueType MOD = 998244353;

    template<typename T1, typename T2, typename T3 = valueType>
    void Inc(T1 &a, T2 b, const T3 &mod = MOD) {
        a = a + b;

        if (a >= mod)
            a -= mod;
    }

    template<typename T1, typename T2, typename T3 = valueType>
    void Dec(T1 &a, T2 b, const T3 &mod = MOD) {
        a = a - b;

        if (a < 0)
            a += mod;
    }

    template<typename T1, typename T2, typename T3 = valueType>
    T1 sum(T1 a, T2 b, const T3 &mod = MOD) {
        return a + b >= mod ? a + b - mod : a + b;
    }

    template<typename T1, typename T2, typename T3 = valueType>
    T1 sub(T1 a, T2 b, const T3 &mod = MOD) {
        return a - b < 0 ? a - b + mod : a - b;
    }

    template<typename T1, typename T2, typename T3 = valueType>
    T1 mul(T1 a, T2 b, const T3 &mod = MOD) {
        return (long long) a * b % mod;
    }

    template<typename T1, typename T2, typename T3 = valueType>
    void Mul(T1 &a, T2 b, const T3 &mod = MOD) {
        a = (long long) a * b % mod;
    }

    template<typename T1, typename T2, typename T3 = valueType>
    T1 pow(T1 a, T2 b, const T3 &mod = MOD) {
        T1 result = 1;

        while (b > 0) {
            if (b & 1)
                Mul(result, a, mod);

            Mul(a, a, mod);
            b = b >> 1;
        }

        return result;
    }
} // namespace MODINT_WITH_FIXED_MOD

using namespace MODINT_WITH_FIXED_MOD;

class BinomialCoefficient {
private:
    valueType N;
    ValueVector _Fact, _InvFact;

public:
    BinomialCoefficient() = default;

    BinomialCoefficient(valueType n) : N(n), _Fact(N + 1, 1), _InvFact(N + 1, 1) {
        for (valueType i = 1; i <= N; ++i)
            _Fact[i] = mul(_Fact[i - 1], i);

        _InvFact[N] = pow(_Fact[N], MOD - 2);

        for (valueType i = N - 1; i >= 0; --i)
            _InvFact[i] = mul(_InvFact[i + 1], i + 1);
    }

    valueType operator()(valueType n, valueType m) {
        if (n < 0 || m < 0 || n < m)
            return 0;

        if (m > N)
            throw std::out_of_range("BinomialCoefficient::operator() : m > N");

        if (n <= N)
            return mul(_Fact[n], mul(_InvFact[m], _InvFact[n - m]));

        valueType result = 1;

        for (valueType i = 0; i < m; ++i)
            Mul(result, n - i);

        Mul(result, _InvFact[m]);

        return result;
    }

    valueType Fact(valueType n) {
        if (n < 0)
            return 0;

        if (n > N)
            throw std::out_of_range("BinomialCoefficient::Fact : n > N");

        return _Fact[n];
    }
};

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);

    valueType N, M;

    std::cin >> N >> M;

    ++M;

    BinomialCoefficient C(N + 10000);

    ValueVector Type(N + 1, 0);

    for (valueType i = 1; i <= N; ++i)
        std::cin >> Type[i];

    ValueMatrix F(N + 1, ValueVector(N + 1, 0));

    F[0][0] = 1;

    for (valueType i = 1; i <= N; ++i) {
        if (Type[i] == 1) {
            for (valueType j = 1; j <= i && j <= M; ++j) {
                F[i][j] = F[i - 1][j - 1];
            }
        } else {
            for (valueType j = 1; j <= i && j <= M; ++j) {
                // 原来
                Inc(F[i][j], mul(F[i - 1][j], j));

                // 新增
                Inc(F[i][j], mul(F[i - 1][j - 1], M - j + 1 - 1));
            }
        }
    }

    valueType ans = 0;

    for (valueType i = 1; i <= M && i <= N; ++i)
        Inc(ans, F[N][i]);

    std::cout << ans << std::endl;

    return 0;
}

Submission Info

Submission Time
Task C - Prefix Mex Sequence
User UserUnauthorized
Language C++ 20 (gcc 12.2)
Score 600
Code Size 4439 Byte
Status AC
Exec Time 118 ms
Memory 199024 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 600 / 600
Status
AC × 2
AC × 27
Set Name Test Cases
Sample 00_sample_01.txt, 00_sample_02.txt
All 00_sample_01.txt, 00_sample_02.txt, 01_test_01.txt, 01_test_02.txt, 01_test_03.txt, 01_test_04.txt, 01_test_05.txt, 01_test_06.txt, 01_test_07.txt, 01_test_08.txt, 01_test_09.txt, 01_test_10.txt, 01_test_11.txt, 01_test_12.txt, 01_test_13.txt, 01_test_14.txt, 01_test_15.txt, 01_test_16.txt, 01_test_17.txt, 01_test_18.txt, 01_test_19.txt, 01_test_20.txt, 01_test_21.txt, 01_test_22.txt, 01_test_23.txt, 01_test_24.txt, 01_test_25.txt
Case Name Status Exec Time Memory
00_sample_01.txt AC 1 ms 3476 KiB
00_sample_02.txt AC 1 ms 3612 KiB
01_test_01.txt AC 1 ms 3728 KiB
01_test_02.txt AC 1 ms 3636 KiB
01_test_03.txt AC 77 ms 198872 KiB
01_test_04.txt AC 118 ms 198876 KiB
01_test_05.txt AC 88 ms 199024 KiB
01_test_06.txt AC 103 ms 198924 KiB
01_test_07.txt AC 102 ms 198796 KiB
01_test_08.txt AC 87 ms 198900 KiB
01_test_09.txt AC 78 ms 198876 KiB
01_test_10.txt AC 100 ms 199020 KiB
01_test_11.txt AC 7 ms 16976 KiB
01_test_12.txt AC 25 ms 58700 KiB
01_test_13.txt AC 9 ms 22872 KiB
01_test_14.txt AC 37 ms 82188 KiB
01_test_15.txt AC 77 ms 177320 KiB
01_test_16.txt AC 86 ms 198956 KiB
01_test_17.txt AC 96 ms 198916 KiB
01_test_18.txt AC 96 ms 198876 KiB
01_test_19.txt AC 97 ms 198800 KiB
01_test_20.txt AC 97 ms 198892 KiB
01_test_21.txt AC 87 ms 183620 KiB
01_test_22.txt AC 70 ms 154440 KiB
01_test_23.txt AC 80 ms 153616 KiB
01_test_24.txt AC 39 ms 76920 KiB
01_test_25.txt AC 63 ms 112816 KiB