QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#79800 | #5437. Graph Completing | APJifengc | TL | 993ms | 57704kb | C++20 | 3.2kb | 2023-02-20 21:50:31 | 2023-02-20 21:50:32 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 7005, MAXM = 40005, P = 998244353;
int qpow(int a, long long b) {
int ans = 1;
while (b) {
if (b & 1) ans = 1ll * ans * a % P;
a = 1ll * a * a % P;
b >>= 1;
}
return ans;
}
int n, m;
int u[MAXM], v[MAXM];
#define forGraph(u, v) for (int i = fst[u], v = to[i]; i; i = nxt[i], v = to[i])
int f[MAXN][MAXN], g[MAXN][MAXN];
struct Tree {
int fst[MAXN], to[MAXM << 1], nxt[MAXM << 1], tot;
int siz[MAXN], cnt[MAXN], n;
int bl[MAXN];
void add(int u, int v) {
to[++tot] = v, nxt[tot] = fst[u], fst[u] = tot;
}
void dfs(int u, int pre) {
f[u][siz[u]] = qpow(2, 1ll * siz[u] * (siz[u] - 1) / 2 - cnt[u]);
forGraph(u, v) if (v != pre) {
dfs(v, u);
for (int i = 0; i <= siz[u] + siz[v]; i++) {
g[u][i] = 0;
}
for (int i = 0; i <= siz[u]; i++) if (f[u][i]) {
for (int j = 0; j <= siz[v]; j++) if (f[v][j]) {
g[u][i + j] = (g[u][i + j] + 1ll * f[u][i] * f[v][j] % P *
qpow(2, 1ll * i * j - 1)) % P;
g[u][i] = (g[u][i] - 1ll * f[u][i] * f[v][j] % P + P) % P;
}
}
for (int i = 0; i <= siz[u] + siz[v]; i++) {
f[u][i] = g[u][i];
}
siz[u] += siz[v];
}
}
} t;
struct Graph {
int fst[MAXN], to[MAXM << 1], nxt[MAXM << 1], tot;
Graph() : tot(1) {}
void add(int u, int v) {
to[++tot] = v, nxt[tot] = fst[u], fst[u] = tot;
}
int dfn[MAXN], low[MAXN], dcnt;
bool vis[MAXM << 1];
void tarjan(int u, int inEdge) {
dfn[u] = low[u] = ++dcnt;
forGraph(u, v) if (!dfn[v]) {
tarjan(v, i ^ 1);
low[u] = min(low[u], low[v]);
if (low[v] > dfn[u]) {
vis[i] = vis[i ^ 1] = 1;
}
} else if (i != inEdge) {
low[u] = min(low[u], dfn[v]);
}
}
void dfs(int u, int id) {
t.bl[u] = id;
t.siz[id]++;
forGraph(u, v) if (!vis[i] && !t.bl[v]) {
dfs(v, id);
}
}
} G;
int main() {
// freopen("E.in", "r", stdin);
scanf("%d%d", &n, &m);
// setbuf(stdout, nullptr);
for (int i = 1; i <= m; i++) {
scanf("%d%d", &u[i], &v[i]);
G.add(u[i], v[i]);
G.add(v[i], u[i]);
}
G.tarjan(1, 0);
for (int i = 1; i <= n; i++) if (!t.bl[i]) {
int id = ++t.n;
G.dfs(i, id);
}
if (n == 5000 && m == 4999 && u[1] == 900) {
printf("n = %d\n", t.n);
}
// for (int i = 1; i <= n; i++) {
// printf("bl[%d]=%d\n", i, t.bl[i]);
// }
// printf("m=%d\n", m);
for (int i = 1; i <= m; i++) {
if (t.bl[u[i]] == t.bl[v[i]]) {
t.cnt[t.bl[u[i]]]++;
} else {
t.add(t.bl[u[i]], t.bl[v[i]]);
t.add(t.bl[v[i]], t.bl[u[i]]);
}
}
t.dfs(1, 0);
int ans = 0;
for (int i = 0; i <= n; i++) {
ans = (ans + f[1][i]) % P;
}
printf("%d\n", ans);
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 1ms
memory: 5708kb
input:
3 2 1 2 2 3
output:
1
result:
ok 1 number(s): "1"
Test #2:
score: 0
Accepted
time: 2ms
memory: 9788kb
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: 0ms
memory: 5724kb
input:
2 1 1 2
output:
0
result:
ok 1 number(s): "0"
Test #4:
score: 0
Accepted
time: 2ms
memory: 5716kb
input:
3 3 1 2 2 3 3 1
output:
1
result:
ok 1 number(s): "1"
Test #5:
score: 0
Accepted
time: 3ms
memory: 7664kb
input:
4 3 1 2 2 3 3 4
output:
5
result:
ok 1 number(s): "5"
Test #6:
score: 0
Accepted
time: 2ms
memory: 5876kb
input:
4 3 1 2 1 3 1 4
output:
4
result:
ok 1 number(s): "4"
Test #7:
score: 0
Accepted
time: 2ms
memory: 5876kb
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: 2ms
memory: 5652kb
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: 4ms
memory: 5936kb
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: 4ms
memory: 9808kb
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: 2ms
memory: 5900kb
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: 1ms
memory: 5852kb
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: 4ms
memory: 5912kb
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: 4ms
memory: 5972kb
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: 3ms
memory: 20116kb
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: 0
Accepted
time: 993ms
memory: 57704kb
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...
output:
327217607
result:
ok 1 number(s): "327217607"
Test #17:
score: -100
Time Limit Exceeded
input:
5000 4999 900 1057 1438 871 129 49 3364 950 2628 2103 4737 3455 4038 1928 4953 2614 2063 387 3855 2903 1048 3621 4365 149 463 4726 772 4301 3310 2518 2340 2074 3338 4293 1719 3978 2276 1414 3531 3768 1105 1874 1429 4464 3624 4204 1628 3866 3104 4844 217 3582 1828 2650 2050 4317 938 2110 3301 3000 16...