QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#838748 | #8047. DFS Order 4 | ucup-team4435 | AC ✓ | 1748ms | 8172kb | C++20 | 5.8kb | 2024-12-31 20:45:18 | 2024-12-31 20:45:18 |
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)
#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;
}
static int primitive_root() {
if constexpr (T::mod == 1'000'000'007)
return 5;
if constexpr (T::mod == 998'244'353)
return 3;
if constexpr (T::mod == 786433)
return 10;
static int root = -1;
if (root != -1)
return root;
std::vector<int> primes;
int value = T::mod - 1;
for (int i = 2; i * i <= value; i++)
if (value % i == 0) {
primes.push_back(i);
while (value % i == 0)
value /= i;
}
if (value != 1)
primes.push_back(value);
for (int r = 2;; r++) {
bool ok = true;
for (auto p : primes)
if ((mint(r).power((T::mod - 1) / p)).value == 1) {
ok = false;
break;
}
if (ok)
return root = r;
}
}
};
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>;
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int n;
cin >> n >> MOD;
if (n <= 3) {
cout << "1\n";
return 0;
}
vector choose(n + 2, vector<mint>(n + 2));
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];
}
}
vector dp(n + 1, vector<mint>(n + 1));
dp[1][0] = 1;
for (int s = 2; s <= n; s++) {
for (int extra = 0; s + extra <= n; extra++) {
dp[s][extra] += dp[s - 1][0] * choose[(s - 2) + extra][extra];
for (int left = 2; left <= s - 2; left++) {
int right = s - left;
dp[s][extra] += dp[left][0] * dp[right][extra] * choose[(left - 1) + (right - 1 + extra)][left - 1];
dp[s][extra] -= dp[left][right - 1 + extra] * dp[right][extra];
}
}
}
cout << dp[n][0] << '\n';
}
这程序好像有点Bug,我给组数据试试?
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3604kb
input:
4 114514199
output:
2
result:
ok 1 number(s): "2"
Test #2:
score: 0
Accepted
time: 0ms
memory: 3712kb
input:
10 998244353
output:
11033
result:
ok 1 number(s): "11033"
Test #3:
score: 0
Accepted
time: 0ms
memory: 3620kb
input:
100 1000000007
output:
270904395
result:
ok 1 number(s): "270904395"
Test #4:
score: 0
Accepted
time: 1452ms
memory: 7516kb
input:
756 1001338769
output:
901942543
result:
ok 1 number(s): "901942543"
Test #5:
score: 0
Accepted
time: 1672ms
memory: 8172kb
input:
793 1009036033
output:
301770320
result:
ok 1 number(s): "301770320"
Test #6:
score: 0
Accepted
time: 1466ms
memory: 7824kb
input:
759 1005587659
output:
846376219
result:
ok 1 number(s): "846376219"
Test #7:
score: 0
Accepted
time: 1544ms
memory: 7836kb
input:
773 1007855479
output:
1398019
result:
ok 1 number(s): "1398019"
Test #8:
score: 0
Accepted
time: 1414ms
memory: 7612kb
input:
751 1006730639
output:
321287237
result:
ok 1 number(s): "321287237"
Test #9:
score: 0
Accepted
time: 1580ms
memory: 7800kb
input:
778 1007760653
output:
430322899
result:
ok 1 number(s): "430322899"
Test #10:
score: 0
Accepted
time: 1703ms
memory: 8052kb
input:
798 1007543827
output:
688720826
result:
ok 1 number(s): "688720826"
Test #11:
score: 0
Accepted
time: 1694ms
memory: 8100kb
input:
796 1004841413
output:
258829347
result:
ok 1 number(s): "258829347"
Test #12:
score: 0
Accepted
time: 1555ms
memory: 7792kb
input:
775 1005185189
output:
744278608
result:
ok 1 number(s): "744278608"
Test #13:
score: 0
Accepted
time: 1748ms
memory: 8048kb
input:
800 1006012831
output:
508549367
result:
ok 1 number(s): "508549367"
Test #14:
score: 0
Accepted
time: 0ms
memory: 3456kb
input:
1 1001338769
output:
1
result:
ok 1 number(s): "1"
Test #15:
score: 0
Accepted
time: 0ms
memory: 3464kb
input:
2 1001338769
output:
1
result:
ok 1 number(s): "1"
Test #16:
score: 0
Accepted
time: 0ms
memory: 3636kb
input:
9 1009036033
output:
1780
result:
ok 1 number(s): "1780"
Test #17:
score: 0
Accepted
time: 0ms
memory: 3716kb
input:
14 1001338769
output:
43297358
result:
ok 1 number(s): "43297358"
Extra Test:
score: 0
Extra Test Passed