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
Judge Result
| Set Name |
Sample |
All |
| Score / Max Score |
0 / 0 |
600 / 600 |
| Status |
|
|
| 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 |