QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#553947 | #9254. Random Variables | ucup-team4435 | RE | 0ms | 3816kb | C++20 | 5.0kb | 2024-09-08 23:41:01 | 2024-09-08 23:41:02 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
#define all(a) begin(a), end(a)
#define len(a) int((a).size())
#ifdef LOCAL
#include "debug.h"
#else
#define dbg(...)
#define dprint(...)
#define debug if constexpr (false)
#define draw_tree(...)
#define draw_array(...)
#endif // LOCAL
// MOD assumed to be prime
template<typename T>
int normalize(T value, int mod) {
if (value < -mod || value >= 2 * mod)
value %= mod;
if (value < 0)
value += mod;
if (value >= mod)
value -= mod;
return value;
}
template<typename T>
struct dynamic_modular_int {
using mint = dynamic_modular_int<T>;
int value;
dynamic_modular_int() : value(0) {}
dynamic_modular_int(const mint &x) : value(x.value) {}
template<typename U, typename V = std::enable_if_t<std::is_integral<U>::value>>
dynamic_modular_int(U value) : value(normalize(value, T::mod)) {}
template<typename U>
mint power(U degree) const {
mint prod = 1;
mint a = *this;
for (; degree > 0; degree >>= 1, a *= a)
if (degree & 1)
prod *= a;
return prod;
}
mint inv() const {
return power(T::mod - 2);
}
mint& operator=(const mint &x) {
value = x.value;
return *this;
}
mint& operator+=(const mint &x) {
value += x.value;
if (value >= T::mod)
value -= T::mod;
return *this;
}
mint& operator-=(const mint &x) {
value -= x.value;
if (value < 0)
value += T::mod;
return *this;
}
mint& operator*=(const mint &x) {
value = (long long) value * x.value % T::mod;
return *this;
}
mint& operator/=(const mint &x) {
return *this *= x.inv();
}
friend mint operator+(const mint &x, const mint &y) {
return mint(x) += y;
}
friend mint operator-(const mint &x, const mint &y) {
return mint(x) -= y;
}
friend mint operator*(const mint &x, const mint &y) {
return mint(x) *= y;
}
friend mint operator/(const mint &x, const mint &y) {
return mint(x) /= y;
}
mint& operator++() {
++value;
if (value == T::mod)
value = 0;
return *this;
}
mint& operator--() {
--value;
if (value == -1)
value = T::mod - 1;
return *this;
}
mint operator++(int) {
mint prev = *this;
value++;
if (value == T::mod)
value = 0;
return prev;
}
mint operator--(int) {
mint prev = *this;
value--;
if (value == -1)
value = T::mod - 1;
return prev;
}
mint operator-() const {
return mint(0) - *this;
}
bool operator==(const mint &x) const {
return value == x.value;
}
bool operator!=(const mint &x) const {
return value != x.value;
}
template<typename U>
explicit operator U() {
return value;
}
friend std::istream& operator>>(std::istream &in, mint &x) {
std::string s;
in >> s;
x = 0;
bool neg = s[0] == '-';
for (const auto c : s)
if (c != '-')
x = x * 10 + (c - '0');
if (neg)
x *= -1;
return in;
}
friend std::ostream& operator<<(std::ostream &out, const mint &x) {
return out << x.value;
}
};
struct dynamic_modular_int_mod {
static int mod;
};
int dynamic_modular_int_mod::mod = 998244353;
int &MOD = dynamic_modular_int_mod::mod;
using mint = dynamic_modular_int<dynamic_modular_int_mod>;
void solve(int /* test_num */) {
int n, m;
cin >> n >> m;
vector choose(n + 1, vector<mint>(n + 1));
for (int i = 0; i < len(choose); i++) {
choose[i][0] = choose[i][i] = 1;
for (int j = 1; j < i; j++) {
choose[i][j] = choose[i - 1][j - 1] + choose[i - 1][j];
}
}
const int K = min(n + 1, m) + 1;
vector dp(n + 1, vector<mint>(K));
fill(all(dp[0]), 1);
mint total = mint(m).power(n);
mint ans = 0;
for (int mx = 1; mx <= n; mx++) {
const int K = min(n / mx + 2, m) + 1;
for (int cnt = 1; cnt <= n; cnt++) {
for (int d = 0; d < K; d++) {
dp[cnt][d] = (m - d) * dp[cnt - 1][d];
if (cnt >= mx && d + 1 < K) {
dp[cnt][d] -= (m - d) * choose[cnt - 1][mx - 1] * dp[cnt - mx][d + 1];
}
}
}
ans += total - dp[n][0];
}
cout << ans << '\n';
}
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int tests;
cin >> tests >> MOD;
for (int test_num = 1; test_num <= tests; test_num++) {
solve(test_num);
}
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3816kb
input:
3 123456789 3 2 5 5 7 7
output:
18 7145 2066323
result:
ok 3 lines
Test #2:
score: -100
Runtime Error
input:
100 2 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 1 10 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 2 10 3 1 3 2 3 3 3 4 3 5 3 6 3 7 3 8 3 9 3 10 4 1 4 2 4 3 4 4 4 5 4 6 4 7 4 8 4 9 4 10 5 1 5 2 5 3 5 4 5 5 5 6 5 7 5 8 5 9 5 10 6 1 6 2 6 3 6 4 6 5 6 6 6 7 6 8 6 9 6 10 7 1 7 2 7 3 7 4 7 5 7 6 7 7 7 8 7 9 7 10 8 1 8 2...