QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#618914 | #5437. Graph Completing | Cipherxzc | TL | 194ms | 200936kb | C++20 | 3.4kb | 2024-10-07 11:40:34 | 2024-10-07 11:40:36 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
const int N = 5005, mod = 998244353;
namespace Tarjan { // 强连通分量
int n, dfn[N], low[N], tot, id[N], num;
bool ins[N];
stack<int> st;
vector<int> e[N], point[N];
inline void add(int u, int v) {
e[u].emplace_back(v);
e[v].emplace_back(u);
}
void init(int n_) {
n = n_;
for (int i = 1; i <= n; i++) {
dfn[i] = 0;
ins[i] = false;
e[i].clear();
}
for (int i = 1; i <= num; i++) {
point[i].clear();
}
tot = num = 0;
}
void tarjan(int p, int fa) {
low[p] = dfn[p] = ++tot;
st.push(p);
ins[p] = true;
for (int q : e[p]) {
if (q == fa) {
continue;
}
if (!dfn[q]) {
tarjan(q, p);
low[p] = min(low[p], low[q]);
} else if (ins[q]) {
low[p] = min(low[p], low[q]);
}
}
if (dfn[p] == low[p]) {
num++;
int q = 0;
while (q != p) {
q = st.top();
st.pop();
ins[q] = false;
id[q] = num;
point[num].emplace_back(q);
}
}
}
void work() { // tarjan缩点的结果符合拓扑序
for (int i = 1; i <= n; i++) {
if (!dfn[i]) {
tarjan(i, 0);
}
}
}
} // namespace Tarjan
using Tarjan::id;
inline LL qp(LL x, LL y) {
LL res = 1;
while (y) {
if (y & 1) {
res = res * x % mod;
}
y >>= 1;
x = x * x % mod;
}
return res;
}
inline LL inv(LL x) { return qp(x, mod - 2); }
int n, m, siz[N], cnt[N];
vector<int> e[N];
LL f[N][N], pw[N * N];
inline void add(int u, int v) { e[u].emplace_back(v); }
void dfs(int p, int fa) {
f[p][siz[p]] = pw[siz[p] * (siz[p] - 1) / 2 - cnt[p]];
for (int q : e[p]) {
if (q == fa) {
continue;
}
dfs(q, p);
LL sum = 0;
for (int i = 1; i <= siz[q]; i++) {
sum += f[q][i];
}
sum %= mod;
siz[p] += siz[q];
for (int i = siz[p]; i >= 0; i--) {
LL tmp = -sum * f[p][i] % mod;
for (int j = 1; j <= min(i, siz[q]); j++) {
tmp = (tmp + f[p][i - j] * f[q][j] % mod * pw[(i - j) * j - 1]) % mod;
}
f[p][i] = tmp;
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
pw[0] = 1;
for (int i = 1; i < N * N; i++) {
pw[i] = pw[i - 1] * 2 % mod;
}
cin >> n >> m;
Tarjan::init(n);
for (int i = 1, u, v; i <= m; i++) {
cin >> u >> v;
Tarjan::add(u, v);
}
Tarjan::work();
for (int i = 1; i <= n; i++) {
siz[id[i]]++;
for (int j : Tarjan::e[i]) {
if (id[i] != id[j]) {
add(id[i], id[j]);
} else if (i < j) {
cnt[id[i]]++;
}
}
}
dfs(1, 0);
LL ans = 0;
for (int i = 1; i <= n; i++) {
ans += f[1][i];
}
ans = (ans % mod + mod) % mod;
cout << ans << endl;
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 62ms
memory: 199276kb
input:
3 2 1 2 2 3
output:
1
result:
ok 1 number(s): "1"
Test #2:
score: 0
Accepted
time: 80ms
memory: 199340kb
input:
4 4 1 2 2 3 3 4 4 1
output:
4
result:
ok 1 number(s): "4"
Test #3:
score: 0
Accepted
time: 83ms
memory: 199528kb
input:
2 1 1 2
output:
0
result:
ok 1 number(s): "0"
Test #4:
score: 0
Accepted
time: 92ms
memory: 199348kb
input:
3 3 1 2 2 3 3 1
output:
1
result:
ok 1 number(s): "1"
Test #5:
score: 0
Accepted
time: 104ms
memory: 199280kb
input:
4 3 1 2 2 3 3 4
output:
5
result:
ok 1 number(s): "5"
Test #6:
score: 0
Accepted
time: 76ms
memory: 199372kb
input:
4 3 1 2 1 3 1 4
output:
4
result:
ok 1 number(s): "4"
Test #7:
score: 0
Accepted
time: 102ms
memory: 199336kb
input:
4 5 1 2 2 3 3 4 4 1 1 3
output:
2
result:
ok 1 number(s): "2"
Test #8:
score: 0
Accepted
time: 84ms
memory: 199492kb
input:
4 6 1 2 2 3 3 4 4 1 1 3 2 4
output:
1
result:
ok 1 number(s): "1"
Test #9:
score: 0
Accepted
time: 101ms
memory: 199476kb
input:
141 9870 124 111 31 87 121 106 127 90 54 125 38 17 115 23 129 111 8 116 90 85 10 29 96 110 24 125 51 113 119 33 58 64 8 5 54 97 112 44 70 138 116 85 38 138 138 21 26 18 69 128 68 31 69 42 126 110 49 118 83 124 69 4 9 110 88 104 48 53 46 30 111 120 99 85 13 85 73 85 40 124 39 38 121 40 46 100 29 61 4...
output:
1
result:
ok 1 number(s): "1"
Test #10:
score: 0
Accepted
time: 82ms
memory: 199472kb
input:
142 10000 19 3 4 86 36 122 36 88 130 86 107 59 3 119 132 90 80 124 122 95 75 66 70 123 63 119 8 44 114 9 81 19 106 77 96 93 79 141 104 50 117 66 30 48 128 109 56 73 106 116 70 8 72 130 59 110 140 20 40 11 134 71 27 51 33 93 82 96 133 118 50 14 32 64 71 12 48 33 22 32 116 17 104 45 66 71 111 142 131 ...
output:
2048
result:
ok 1 number(s): "2048"
Test #11:
score: 0
Accepted
time: 89ms
memory: 199428kb
input:
200 10000 47 42 33 120 146 144 94 170 170 181 20 101 185 190 197 33 18 37 12 86 148 115 136 120 41 182 120 11 44 132 167 67 118 139 114 52 80 37 171 56 93 139 113 112 129 122 166 4 47 60 57 6 104 119 179 104 107 1 8 70 197 70 39 127 134 1 18 26 85 100 158 121 61 105 33 113 51 54 45 85 45 130 97 164 ...
output:
365281854
result:
ok 1 number(s): "365281854"
Test #12:
score: 0
Accepted
time: 92ms
memory: 199748kb
input:
500 10000 453 98 266 181 170 163 213 8 447 241 197 380 44 136 383 217 142 351 252 381 34 87 8 100 173 306 322 35 481 398 267 493 94 457 391 198 381 436 455 468 481 415 307 470 376 1 178 480 379 75 133 248 466 165 394 296 302 50 142 42 388 454 92 239 63 310 118 159 397 257 282 308 137 370 24 389 353 ...
output:
980584487
result:
ok 1 number(s): "980584487"
Test #13:
score: 0
Accepted
time: 88ms
memory: 199840kb
input:
1000 10000 818 182 136 75 353 22 34 927 455 560 720 103 752 822 493 253 627 976 34 951 329 587 292 180 189 524 345 84 420 939 97 11 141 631 232 79 600 473 351 100 567 735 237 571 582 459 39 723 709 632 784 391 448 176 643 808 336 874 696 44 819 143 5 470 690 781 875 230 872 570 681 211 270 157 106 1...
output:
588230924
result:
ok 1 number(s): "588230924"
Test #14:
score: 0
Accepted
time: 88ms
memory: 199964kb
input:
2000 10000 820 636 1257 375 1342 1314 1243 1839 1469 1206 46 675 172 1422 1121 412 1882 900 1543 709 1811 727 1217 1205 1411 674 365 738 1184 1568 1781 1999 1591 556 1755 432 28 1231 1809 1461 270 1485 1087 1636 1471 1683 148 984 452 321 393 1844 800 1491 657 951 1943 1550 1593 924 1201 1474 1148 70...
output:
950164126
result:
ok 1 number(s): "950164126"
Test #15:
score: 0
Accepted
time: 194ms
memory: 200936kb
input:
5000 10000 2319 4192 4971 4546 4619 2058 1652 3642 2789 4237 2458 3238 2642 4855 2347 4170 1752 4173 2834 3683 1659 4380 4572 2645 116 4683 2667 3234 895 4589 2283 2027 53 3963 3590 726 783 3836 2019 722 3464 461 1805 2302 2404 3192 4015 3107 4256 1911 4734 3106 2902 3995 4592 2782 2099 478 3687 228...
output:
583179928
result:
ok 1 number(s): "583179928"
Test #16:
score: -100
Time Limit Exceeded
input:
5000 4999 2338 1012 4038 1912 2148 2944 1852 501 3624 2551 857 852 3031 1067 1102 808 2019 1627 1351 879 2463 4890 4431 724 1626 2136 2952 698 3556 378 1651 28 3163 3413 4862 2026 4448 104 3909 147 1718 862 4537 3495 20 1589 2520 2860 990 2316 727 4827 178 3027 4199 4590 683 4827 1724 3072 2717 1854...