UOJ Logo

NOI.AC

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#202219#2324. dominoAnonyme1001566ms99532kbC++113.7kb2024-02-14 10:15:072024-02-14 12:25:03

answer


#include <bits/stdc++.h>
#define EB emplace_back

typedef long long ll;
typedef std::vector <int> vector;
const int N = 5000, M = 66666, mod = 998244353;

struct edge {
	int u, v;
	edge (int u0 = 0, int v0 = 0) : u(u0), v(v0) {}
} e[M];

int R, C, V, E = 0;
int p[N], mat[N][N], elim[N];
int to[M], first[N], next[M];
int orient[M];

inline void addedge(int u, int v) {
//	fprintf(stderr, "addedge %d %d\n", u, v);
	e[++E] = edge(u, v), next[E] = first[u], first[u] = E;
	e[++E] = edge(v, u), next[E] = first[v], first[v] = E;
}

inline int join(int r, int c) {return (r - 1) * C + 1;}
inline void split(int id, int &r, int &c) {r = --id / C + 1, c = id % C + 1;}
inline int ancestor(int x) {return p[x] == x ? x : (p[x] = ancestor(p[x]));}
inline bool Union(int x, int y) {
	if ((x = ancestor(x)) == (y = ancestor(y))) return true;
	return p[x] = y, false;
}

ll PowerMod(ll a, int n, ll c = 1) {for (; n; n >>= 1, a = a * a % mod) if (n & 1) c = c * a % mod; return c;}

int gauss(int n) {
	int i, j, k, *t, det = 1, cnt; ll coe;
	static int *m[N];
	for (i = 0; i < n; ++i) m[i] = mat[i];
	for (i = 0; i < n; ++i) {
		for (j = i; j < n && !m[j][i]; ++j);
		if (j == n) return 0;
		if (i != j) det = mod - det, std::swap(m[i], m[j]);
		det = (ll)det * m[i][i] % mod;
		coe = PowerMod(m[i][i], mod - 2);
		for (j = 0; j < n; ++j) m[i][j] = m[i][j] * coe % mod;
		for (cnt = 0, k = i; k < n; ++k) if (m[i][k]) elim[cnt++] = k;
		for (k = i + 1; k < n; ++k) if (m[k][i]) {
			coe = mod - m[k][i];
			for (t = elim; t != elim + cnt; ++t)
				m[k][*t] = (m[k][*t] + coe * m[i][*t]) % mod;
		}
	}
	return det;
}

namespace Planar {
	#define ad(x) (((x - 1) ^ 1) + 1)
	int F = 0;
	int belF[M], remain[M], que[M];
	vector face[M];

	inline bool judge(int A, int B, int C, int D) {
		if (B == A + ::C) return (D - 1) % ::C < (C - 1) % ::C;
		if (B == A - ::C) return (C - 1) % ::C < (D - 1) % ::C;
		if (B == A + 1) return C < D;
		if (B == A - 1) return D < C;
		abort();
	}

	void dfs(int i) {
		int j, x = e[i].u, y = e[i].v, z, bestV = 0, bestE = 0;
//		fprintf(stderr, "search face #%d edge #%d (%d, %d)\n", F, i, x, y);
		belF[i] = F, face[F].EB(i);
		for (j = first[y]; j; j = next[j]) {
			if ((z = e[j].v) == x) continue;
			if (!bestV || judge(x, y, z, bestV)) bestV = z, bestE = j;
		}
		if (!bestE) {
			for (j = first[y]; j; j = next[j]) if (e[j].v == x) break;
			bestV = x, bestE = j;
		}
		if (belF[bestE] != F) dfs(bestE);
	}

	int main() {
		int i, f, h, t = 0; bool o;
		for (i = 1; i <= E; ++i)
			if (!belF[i]) ++F, dfs(i), remain[F] = face[F].size();
		for (i = 1; i <= F; ++i)
			for (int e : face[i])
				if (orient[e] && --remain[i] == 1) que[t++] = i;
		for (h = 0; h < t; ++h) {
			f = que[h], o = true;
			if (!remain[f]) continue;
			for (int e : face[f])
				if (orient[e]) o ^= orient[e] != e;
				else i = e;
			orient[ad(i)] = orient[i] = (o ? ad(i) : i);
			if (--remain[ f = belF[ad(i)] ] == 1) que[t++] = f;
		}
		for (i = 1; i <= E; ++i) assert(orient[i]);
		return 0;
	}
}

int main() {
	int i, j, v, n;
	scanf("%d%d", &R, &C), V = R * C;
	if (R & C & 1) return putchar(48), putchar(10), 0;
	for (n = i = 1; i <= R; ++i, ++n)
		for (j = 1; j < C; ++j, ++n)
			if (scanf("%d", &v), !v) addedge(n, n + 1);
	for (n = i = 1; i < R; ++i)
		for (j = 1; j <= C; ++j, ++n)
			if (scanf("%d", &v), !v) addedge(n, n + C);
	std::iota(p + 1, p + (V + 1), 1);
	for (i = 1; i <= E; i += 2)
		if (!Union(e[i].u, e[i].v)) {
			orient[i] = orient[i + 1] = i;
//			fprintf(stderr, "connect %d %d\n", e[i].u, e[i].v);
		}
	Planar::main();
	for (i = 1; i <= E; ++i) if (orient[i] == i)
		mat[e[i].u - 1][e[i].v - 1] = 1, mat[e[i].v - 1][e[i].u - 1] = mod - 1;
	printf("%d\n", gauss(V));
	return 0;
}

Details

小提示:点击横条可展开更详细的信息

Subtask #1:

score: 10
Accepted

Test #1:

score: 10
Accepted
time: 0ms
memory: 3424kb

input:

4 4
0 1 0
1 0 1
1 0 0
1 0 1
1 0 0 1
1 1 0 0
0 0 0 0

output:

0

result:

ok 1 number(s): "0"

Test #2:

score: 0
Accepted
time: 0ms
memory: 3424kb

input:

4 4
1 0 1
0 1 0
0 1 1
0 0 1
0 1 0 0
0 0 0 0
0 0 0 0

output:

1

result:

ok 1 number(s): "1"

Test #3:

score: 0
Accepted
time: 0ms
memory: 3428kb

input:

4 4
0 1 0
1 0 0
0 1 0
0 0 0
1 0 1 1
0 0 0 0
1 0 0 1

output:

4

result:

ok 1 number(s): "4"

Test #4:

score: 0
Accepted
time: 0ms
memory: 3424kb

input:

4 4
0 1 1
0 0 1
0 0 1
0 0 0
1 0 0 0
0 0 0 0
0 1 0 1

output:

0

result:

ok 1 number(s): "0"

Test #5:

score: 0
Accepted
time: 0ms
memory: 3428kb

input:

4 4\x0d0 0 0\x0d0 0 0\x0d0 0 1\x0d0 0 0\x0d0 1 0 0\x0d0 0 1 0\x0d0 0 1 0

output:

16

result:

ok 1 number(s): "16"

Test #6:

score: 0
Accepted
time: 2ms
memory: 3420kb

input:

4 4
1 0 1
0 0 0
1 1 1
1 0 0
1 0 0 0
0 0 0 0
0 1 0 1

output:

0

result:

ok 1 number(s): "0"

Test #7:

score: 0
Accepted
time: 0ms
memory: 3420kb

input:

4 4
0 0 0
0 0 0
0 0 0
0 0 1
0 1 1 0
0 0 0 0
0 0 1 1

output:

0

result:

ok 1 number(s): "0"

Test #8:

score: 0
Accepted
time: 0ms
memory: 3416kb

input:

4 4
0 0 0
0 0 1
0 1 1
0 1 0
1 0 0 0
0 0 1 1
0 1 1 1

output:

0

result:

ok 1 number(s): "0"

Test #9:

score: 0
Accepted
time: 0ms
memory: 3424kb

input:

4 4
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0 0
0 0 0 0
0 0 0 0

output:

1296

result:

ok 1 number(s): "1296"

Test #10:

score: 0
Accepted
time: 2ms
memory: 3428kb

input:

4 4
0 0 1
0 0 1
0 0 0
0 0 0
0 0 0 0
0 1 0 0
0 0 0 0

output:

225

result:

ok 1 number(s): "225"

Subtask #2:

score: 10
Accepted

Test #11:

score: 10
Accepted
time: 3ms
memory: 6804kb

input:

23 24
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 ...

output:

240007691

result:

ok 1 number(s): "240007691"

Test #12:

score: 0
Accepted
time: 0ms
memory: 3756kb

input:

30 3
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0...

output:

815133580

result:

ok 1 number(s): "815133580"

Test #13:

score: 0
Accepted
time: 27ms
memory: 25688kb

input:

37 52
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

output:

121321543

result:

ok 1 number(s): "121321543"

Test #14:

score: 0
Accepted
time: 16ms
memory: 16208kb

input:

44 31
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

output:

738812373

result:

ok 1 number(s): "738812373"

Test #15:

score: 0
Accepted
time: 3ms
memory: 6456kb

input:

51 10
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 ...

output:

811370631

result:

ok 1 number(s): "811370631"

Subtask #3:

score: 20
Accepted

Test #16:

score: 20
Accepted
time: 0ms
memory: 4620kb

input:

25 10
0 0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 1
0 0 ...

output:

718568148

result:

ok 1 number(s): "718568148"

Test #17:

score: 0
Accepted
time: 3ms
memory: 4620kb

input:

25 10
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 1 ...

output:

236276332

result:

ok 1 number(s): "236276332"

Test #18:

score: 0
Accepted
time: 0ms
memory: 4620kb

input:

25 10
0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0
0 0 ...

output:

206472986

result:

ok 1 number(s): "206472986"

Test #19:

score: 0
Accepted
time: 0ms
memory: 4616kb

input:

25 10
0 1 0 0 0 0 0 1 0
0 0 1 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0
0 0 ...

output:

932016924

result:

ok 1 number(s): "932016924"

Test #20:

score: 0
Accepted
time: 0ms
memory: 4616kb

input:

25 10
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 1
0 0 0 0 0 0 0 0 0
0 0 ...

output:

675629324

result:

ok 1 number(s): "675629324"

Test #21:

score: 0
Accepted
time: 0ms
memory: 4616kb

input:

25 10
0 0 0 0 0 0 1 1 1
0 0 0 0 0 0 0 0 0
1 0 0 1 0 1 0 1 0
0 0 1 0 0 0 1 0 0
0 0 0 0 0 0 0 0 0
0 0 ...

output:

283307115

result:

ok 1 number(s): "283307115"

Test #22:

score: 0
Accepted
time: 0ms
memory: 4620kb

input:

25 10
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 1 ...

output:

384432018

result:

ok 1 number(s): "384432018"

Test #23:

score: 0
Accepted
time: 0ms
memory: 4616kb

input:

25 10
0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0
1 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0
0 0 ...

output:

167820250

result:

ok 1 number(s): "167820250"

Test #24:

score: 0
Accepted
time: 2ms
memory: 4616kb

input:

25 10
0 0 0 0 0 0 0 0 1
0 0 0 0 0 1 0 0 1
0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 1 1 0
0 0 1 0 0 0 0 0 0
0 0 ...

output:

710444478

result:

ok 1 number(s): "710444478"

Test #25:

score: 0
Accepted
time: 0ms
memory: 4616kb

input:

25 10
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 1
0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 1 0 0
0 0 0 1 0 0 0 0 0
0 0 ...

output:

242871638

result:

ok 1 number(s): "242871638"

Subtask #4:

score: 30
Accepted

Test #26:

score: 30
Accepted
time: 0ms
memory: 7208kb

input:

25 24
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 ...

output:

990444078

result:

ok 1 number(s): "990444078"

Test #27:

score: 0
Accepted
time: 3ms
memory: 7204kb

input:

25 24
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
0 ...

output:

525963740

result:

ok 1 number(s): "525963740"

Test #28:

score: 0
Accepted
time: 3ms
memory: 7204kb

input:

25 24
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
0 ...

output:

487193228

result:

ok 1 number(s): "487193228"

Test #29:

score: 0
Accepted
time: 3ms
memory: 7160kb

input:

25 24
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 ...

output:

0

result:

ok 1 number(s): "0"

Test #30:

score: 0
Accepted
time: 3ms
memory: 7204kb

input:

25 24
0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 ...

output:

920679202

result:

ok 1 number(s): "920679202"

Test #31:

score: 0
Accepted
time: 0ms
memory: 5092kb

input:

20 20
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 1 0 ...

output:

0

result:

ok 1 number(s): "0"

Test #32:

score: 0
Accepted
time: 0ms
memory: 7200kb

input:

25 24
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 ...

output:

551091036

result:

ok 1 number(s): "551091036"

Test #33:

score: 0
Accepted
time: 0ms
memory: 7208kb

input:

25 24
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 ...

output:

627800602

result:

ok 1 number(s): "627800602"

Test #34:

score: 0
Accepted
time: 3ms
memory: 7204kb

input:

25 24
0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 ...

output:

442701383

result:

ok 1 number(s): "442701383"

Test #35:

score: 0
Accepted
time: 5ms
memory: 7200kb

input:

25 24
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0
0 ...

output:

786418198

result:

ok 1 number(s): "786418198"

Test #36:

score: 0
Accepted
time: 0ms
memory: 5092kb

input:

20 20
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 1 0 ...

output:

0

result:

ok 1 number(s): "0"

Subtask #5:

score: 30
Accepted

Test #37:

score: 30
Accepted
time: 203ms
memory: 99528kb

input:

70 70
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

output:

628348397

result:

ok 1 number(s): "628348397"

Test #38:

score: 0
Accepted
time: 191ms
memory: 99528kb

input:

70 70
0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 ...

output:

915611786

result:

ok 1 number(s): "915611786"

Test #39:

score: 0
Accepted
time: 104ms
memory: 53628kb

input:

70 70
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

output:

0

result:

ok 1 number(s): "0"

Test #40:

score: 0
Accepted
time: 203ms
memory: 97680kb

input:

70 70
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 ...

output:

0

result:

ok 1 number(s): "0"

Test #41:

score: 0
Accepted
time: 169ms
memory: 99532kb

input:

70 70
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

output:

160226287

result:

ok 1 number(s): "160226287"

Test #42:

score: 0
Accepted
time: 176ms
memory: 99532kb

input:

70 70
1 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

output:

470741178

result:

ok 1 number(s): "470741178"

Test #43:

score: 0
Accepted
time: 184ms
memory: 99532kb

input:

70 70
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 ...

output:

725093586

result:

ok 1 number(s): "725093586"

Test #44:

score: 0
Accepted
time: 12ms
memory: 26208kb

input:

70 70
0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 ...

output:

0

result:

ok 1 number(s): "0"

Test #45:

score: 0
Accepted
time: 178ms
memory: 99528kb

input:

70 70
0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

output:

933523972

result:

ok 1 number(s): "933523972"

Test #46:

score: 0
Accepted
time: 68ms
memory: 46852kb

input:

70 70
0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

output:

0

result:

ok 1 number(s): "0"