QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#325660 | #946. Magic Tree | Camillus# | 0 | 1ms | 4088kb | C++20 | 2.9kb | 2024-02-11 19:03:35 | 2024-07-04 03:23:35 |
answer
/// @author Camillus <3
#include "bits/stdc++.h"
using ull = unsigned long long;
using namespace std;
struct mint {
static constexpr int mod = 998'244'353;
int value = 0;
mint() = default;
mint(int value) : value(value) {}
mint& operator+=(const mint &other) {
value += other.value;
if (value >= mod) {
value -= mod;
}
return *this;
}
mint operator+(const mint &other) const {
return mint(value) += other;
}
mint& operator-=(const mint &other) {
value += mod - other.value;
if (value >= mod) {
value -= mod;
}
return *this;
}
mint operator-(const mint &other) const {
return mint(value) -= other;
}
mint &operator*=(const mint &other) {
value = 1ll * value * other.value % mod;
return *this;
}
mint operator*(const mint &other) const {
return mint(value) *= other;
}
mint power(int k) const {
mint result = 1;
mint current = *this;
while (k) {
if (k & 1) {
result *= current;
}
current *= current;
k >>= 1;
}
return result;
}
mint &operator/=(const mint &other) {
return this->operator*=(other.power(mod - 2));
}
mint operator/(const mint &other) const {
return mint(value) /= other;
}
friend ostream& operator<<(ostream &out, const mint &other) {
return out << other.value;
}
friend istream& operator>>(istream &in, mint &other) {
return in >> other.value;
}
};
vector<int> g[18];
unordered_map<ull, mint> saved;
int n;
mint calc(ull maskA, ull maskB) {
if (maskA == (1 << n) - 1 && maskB == 0) {
return 1;
} else if (maskB == 0) {
return 0;
}
if (saved.contains(maskA << n | maskB)) {
return saved[maskA << n | maskB];
}
bitset<18> A(maskA);
bitset<18> B(maskB);
mint sum = 0;
for (int u = 0; u < n; u++) {
if (B[u]) {
B[u] = false;
auto Ap = A;
Ap[u] = true;
auto Bp = B;
for (int v : g[u]) {
if (!A[v]) {
Bp[v] = true;
}
}
sum += calc(Ap.to_ullong(), Bp.to_ullong());
}
}
return saved[maskA << n | maskB] = sum;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
saved.reserve(1e5);
int m;
cin >> n >> m;
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
u--, v--;
g[u].push_back(v);
g[v].push_back(u);
}
cout << calc(0, (1 << n) - 1) / 2 << '\n';
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Subtask #1:
score: 0
Wrong Answer
Test #1:
score: 0
Wrong Answer
time: 1ms
memory: 4088kb
input:
10 9 10 1 1 2 2 3 1 3 8 3 5 4 1 9 4 1 6 8 1 3 1 1 4 9 1 10 1 1 2 6 1 8 7 1 7 9 1
output:
192
result:
wrong answer expected '7', found '192'
Subtask #2:
score: 0
Runtime Error
Test #10:
score: 0
Runtime Error
input:
100000 25000 100000 1 1 2 1 2 1 5 8 8 2 5 2 2 3 1 2 11 10 18 2 9 9 9 8 1 19 18 22 20 17 20 13 30 5 9 8 13 2 19 26 14 31 23 22 2 21 8 1 22 9 50 19 49 42 47 19 21 57 9 52 41 39 10 14 60 56 34 17 18 22 53 5 34 64 29 72 33 11 9 67 58 10 58 70 57 26 65 10 15 64 67 20 26 13 51 81 11 78 40 53 70 33 34 92 7...
output:
result:
Subtask #3:
score: 0
Runtime Error
Test #15:
score: 0
Runtime Error
input:
1000 500 1000 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 9...
output:
result:
Subtask #4:
score: 0
Runtime Error
Test #21:
score: 0
Runtime Error
input:
100000 90000 2 1 1 3 2 1 2 1 5 1 8 11 9 1 8 12 7 1 2 7 6 12 9 16 18 13 10 23 27 26 17 23 10 24 11 21 13 30 1 11 6 13 8 30 15 17 34 39 41 32 29 27 17 21 12 26 33 10 50 29 17 46 33 21 28 47 26 3 67 38 5 10 45 61 70 59 17 46 40 20 58 67 68 15 62 71 71 57 32 81 18 66 7 14 51 67 92 86 38 88 60 45 54 5 59...
output:
result:
Subtask #5:
score: 0
Skipped
Dependency #1:
0%
Subtask #6:
score: 0
Runtime Error
Test #31:
score: 0
Runtime Error
input:
20000 800 60000 1 1 1 2 3 1 7 8 6 1 7 6 1 7 14 16 11 13 14 3 11 11 4 2 5 24 20 24 16 30 15 3 24 31 12 7 2 29 14 25 39 23 16 33 32 33 34 9 13 37 33 23 15 21 28 39 51 19 6 50 54 55 8 40 3 7 34 19 28 15 61 18 22 28 38 15 47 37 42 73 38 61 10 7 30 58 41 43 69 89 62 84 30 68 92 84 43 59 44 75 8 100 83 18...
output:
result:
Subtask #7:
score: 0
Skipped
Dependency #3:
0%
Subtask #8:
score: 0
Skipped
Dependency #1:
0%