QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#793976 | #9442. Music Game | rgnerdplayer | WA | 0ms | 3844kb | C++23 | 4.6kb | 2024-11-30 08:05:48 | 2024-11-30 08:05:49 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
template <int P>
struct ModInt {
int v;
constexpr ModInt() : v(0) {}
constexpr ModInt(i64 v_) : v(v_ % P) {
if (v < 0) {
v += P;
}
}
constexpr explicit operator int() const { return v; }
constexpr friend ostream& operator<<(ostream &out, ModInt n) {
return out << int(n);
}
constexpr friend istream& operator>>(istream &in, ModInt &n) {
i64 v;
in >> v;
n = ModInt(v);
return in;
}
constexpr friend bool operator==(ModInt a, ModInt b) {
return a.v == b.v;
}
constexpr friend bool operator!=(ModInt a, ModInt b) {
return a.v != b.v;
}
constexpr ModInt operator-() {
ModInt res;
res.v = v ? P - v : 0;
return res;
}
constexpr ModInt& operator++() {
v++;
if (v == P) v = 0;
return *this;
}
constexpr ModInt& operator--() {
if (v == 0) v = P;
v--;
return *this;
}
constexpr ModInt& operator+=(ModInt o) {
v -= P - o.v;
v = (v < 0) ? v + P : v;
return *this;
}
constexpr ModInt& operator-=(ModInt o) {
v -= o.v;
v = (v < 0) ? v + P : v;
return *this;
}
constexpr ModInt& operator*=(ModInt o) {
v = 1LL * v * o.v % P;
return *this;
}
constexpr ModInt& operator/=(ModInt o) { return *this *= o.inv(); }
constexpr friend ModInt operator++(ModInt &a, int) {
ModInt r = a;
++a;
return r;
}
constexpr friend ModInt operator--(ModInt &a, int) {
ModInt r = a;
--a;
return r;
}
constexpr friend ModInt operator+(ModInt a, ModInt b) {
return ModInt(a) += b;
}
constexpr friend ModInt operator-(ModInt a, ModInt b) {
return ModInt(a) -= b;
}
constexpr friend ModInt operator*(ModInt a, ModInt b) {
return ModInt(a) *= b;
}
constexpr friend ModInt operator/(ModInt a, ModInt b) {
return ModInt(a) /= b;
}
constexpr ModInt qpow(i64 p) {
ModInt res = 1, x = v;
while (p > 0) {
if (p & 1) { res *= x; }
x *= x;
p >>= 1;
}
return res;
}
constexpr ModInt inv() {
return qpow(P - 2);
}
};
constexpr int P = 998244353;
using Mint = ModInt<P>;
struct Combinatorial {
int n;
vector<Mint> _fact;
vector<Mint> _ifact;
vector<Mint> _inv;
Combinatorial() : n{0}, _fact{1}, _ifact{1}, _inv{0} {}
Combinatorial(int n) : Combinatorial() {
init(n);
}
void init(int m) {
if (m <= n) return;
_fact.resize(m + 1);
_ifact.resize(m + 1);
_inv.resize(m + 1);
for (int i = n + 1; i <= m; i++) {
_fact[i] = _fact[i - 1] * i;
}
_ifact[m] = _fact[m].inv();
for (int i = m; i > n; i--) {
_ifact[i - 1] = _ifact[i] * i;
_inv[i] = _ifact[i] * _fact[i - 1];
}
n = m;
}
Mint fact(int m) {
if (m > n) init(2 * m);
return _fact[m];
}
Mint ifact(int m) {
if (m > n) init(2 * m);
return _ifact[m];
}
Mint inv(int m) {
if (m > n) init(2 * m);
return _inv[m];
}
Mint binom(int n, int m) {
if (n < m || m < 0) return 0;
return fact(n) * ifact(m) * ifact(n - m);
}
} comb;
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
auto solve = [&]() {
int n, m;
cin >> n >> m;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
vector<int> o(n);
iota(o.begin(), o.end(), 0);
sort(o.begin(), o.end(), [&](int i, int j) { return a[i] > a[j]; });
vector<Mint> dp(m + 1), ans(n + 1);
dp[0] = 1;
for (int i = 0; i < n; i++) {
Mint s = 0;
for (int j = max(0, m - a[o[i]]); j <= m; j++) {
s += dp[j];
}
for (int j = 0; j <= n - i - 1; j++) {
ans[j] += s * comb.binom(n - i - 1, j);
}
for (int j = m; j >= 0; j--) {
dp[min(j + a[o[i]], m)] += dp[j];
}
}
for (int i = 0; i <= n; i++) {
cout << ans[i] << '\n';
}
};
solve();
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Wrong Answer
time: 0ms
memory: 3844kb
input:
2 3 3 5 2 4 7
output:
3 1 0
result:
wrong answer 1st words differ - expected: '831870305', found: '3'