Submission #9582191


Source Code Expand

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
using ll = long long;
const int MOD = 998244353;

int madd(int a, int b) {
	int res = a + (b < 0 ? b + MOD : b);
	return (res >= MOD ? res - MOD : res);
}

const int N = 10;
const int M = 1 << N;
int col[N][N];
int dp[M][M];
int alts[M * M][2*N+1];

bool check(int m0, int m1) {
	vector<int> rc(N, 0), cc(N, 0);
	for (int y = 0; y < N; ++y) {
		if (! (m0 & (1 << y))) rc[y] = 3;
	}
	for (int x = 0; x < N; ++x) {
		if (! (m1 & (1 << x))) cc[x] = 3;
	}
	for (int y = 0; y < N; ++y) {
		if (! (m0 & (1 << y))) continue;
		for (int x = 0; x < N; ++x) {
			if (! (m1 & (1 << x))) continue;
			rc[y] |= col[y][x];
			cc[x] |= col[y][x];
		}
	}
	bool works = true;
	for (auto v : rc) works &= (v == 3);
	for (auto v : cc) works &= (v == 3);
	return works;
}

// Calculate alternating sum over submasks
int altSum(int m0, int m1) {
	int m = m0 | (m1 << N);
	alts[m][2*N] = dp[m0][m1];
	for (int j = 2*N - 1; j >= 0; --j) {
		if (m & (1 << j)) {
			alts[m][j] = madd(alts[m][j+1], -alts[m ^ (1 << j)][j+1]);
		} else {
			alts[m][j] = alts[m][j+1];
		}
	}
	return alts[m][0];
}

// Set value of DP at mask m0 m1 val.
void setDP(int m0, int m1, int val) {
	dp[m0][m1] = val;
	altSum(m0, m1);
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);

	int h, w;
	cin >> h >> w;
	for (int y = 0; y < h; ++y) {
		string row;
		cin >> row;
		for (int x = 0; x < w; ++x) col[y][x] = 1 + (row[x] == '#');
	}

	// If any operations are applied, then some rows or some columns must be completely black or white
	// Delete those columns and rows and solve recursively. We need to do inclusion-exclusion to not double-count solutions.
	// Where does the initial state of the grid matter? If in some subgrid we have no completely black or white columns or rows,
	// we can add one to the solution for that subgrid!
	// To calculate the answer sufficiently fast, we'll need to do some prefix sums.

	int h0 = 1 << h;
	int h1 = 1 << w;
	for (int m0 = 0; m0 < h0; ++m0) {
		setDP(m0, 0, 1);
	}
	for (int m1 = 0; m1 < h1; ++m1) {
		setDP(0, m1, 1);
	}

	for (int m0 = 0; m0 < h0; ++m0) {
		int rc = __builtin_popcount(m0);
		if (rc == 0) continue;
		for (int m1 = 0; m1 < h1; ++m1) {
			int cc = __builtin_popcount(m1);
			if (cc == 0) continue;

			int res = check(m0, m1);
			// Inclusion-exclusion, paint only multiple rows
			for (int s0 = m0;; s0 = (s0 - 1) & m0) {
				int pw = rc - __builtin_popcount(s0);
				if (pw > 1) {
					ll mult = (ll)(pw & 1 ? 1 : MOD - 1) * ((1 << pw) - 2) % MOD;
					res = (res + (ll)mult * dp[s0][m1]) % MOD;
				}
				if (s0 == 0) break;
			}
			// Inclusion-exclusion, paint only multiple columns
			for (int s1 = m1;; s1 = (s1 - 1) & m1) {
				int pw = cc - __builtin_popcount(s1);
				if (pw > 1) {
					ll mult = (ll)(pw & 1 ? 1 : MOD - 1) * ((1 << pw) - 2) % MOD;
					res = (res + (ll)mult * dp[m0][s1]) % MOD;
				}
				if (s1 == 0) break;
			}


			// Inclusion-exclusion, paint both rows and columns
			int add = MOD - altSum(m0, m1);
			add = madd(add, add);
			res = madd(res, add);

			setDP(m0, m1, res);
		}
	}
	cout << dp[h0-1][h1-1] << '\n';
}

Submission Info

Submission Time
Task F - Monochromization
User mangolassi
Language C++14 (GCC 5.4.1)
Score 1100
Code Size 3286 Byte
Status AC
Exec Time 1766 ms
Memory 90368 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 1100 / 1100
Status
AC × 4
AC × 24
Set Name Test Cases
Sample sample-01.txt, sample-02.txt, sample-03.txt, sample-04.txt
All 01.txt, 02.txt, 03.txt, 04.txt, 05.txt, 06.txt, 07.txt, 08.txt, 09.txt, 10.txt, 11.txt, 12.txt, 13.txt, 14.txt, 15.txt, 16.txt, 17.txt, 18.txt, 19.txt, 20.txt, sample-01.txt, sample-02.txt, sample-03.txt, sample-04.txt
Case Name Status Exec Time Memory
01.txt AC 2 ms 4480 KiB
02.txt AC 6 ms 12672 KiB
03.txt AC 4 ms 2688 KiB
04.txt AC 65 ms 23424 KiB
05.txt AC 64 ms 23424 KiB
06.txt AC 65 ms 23424 KiB
07.txt AC 65 ms 23424 KiB
08.txt AC 1753 ms 90368 KiB
09.txt AC 1756 ms 90368 KiB
10.txt AC 777 ms 49408 KiB
11.txt AC 1766 ms 90368 KiB
12.txt AC 1761 ms 90368 KiB
13.txt AC 757 ms 89344 KiB
14.txt AC 1754 ms 90368 KiB
15.txt AC 1760 ms 90368 KiB
16.txt AC 1755 ms 90368 KiB
17.txt AC 1761 ms 90368 KiB
18.txt AC 19 ms 86400 KiB
19.txt AC 1753 ms 90368 KiB
20.txt AC 1756 ms 90368 KiB
sample-01.txt AC 2 ms 2304 KiB
sample-02.txt AC 2 ms 2304 KiB
sample-03.txt AC 2 ms 2432 KiB
sample-04.txt AC 9 ms 12800 KiB