CF838A Binary Blocks

题目描述

给定一张图片,可以用一个 $n$ 行 $m$ 列的二维网格来表示。图片中的每个像素点要么亮起,要么熄灭,分别用字符 "0" 或 "1" 表示。你希望对这张图片进行压缩。你想选择一个整数 $k>1$,将图片划分为 $k\times k$ 的小块。如果 $n$ 和 $m$ 不能被 $k$ 整除,则在图片的右边和底部用 0 填充,直到其可以被 $k$ 整除。每个小块内的所有像素值必须相同。当前的图片可能无法被直接压缩。请你求出,为了让图片能够对某个 $k$ 被压缩(即所有 $k\times k$ 块内像素相同,允许选择 $k$),在填充以后,至少需要翻转多少个像素点。具体过程为:首先选择 $k$,然后用 0 填充图片右侧和底部,然后你可以翻转像素点,使其能被 $k$ 压缩。最终图片必须能够被 $k$ 压缩。

输入格式

第一行输入包含两个整数 $n, m$,分别表示图片的行数和列数,$2 \leq n, m \leq 2500$。 接下来 $n$ 行,每行包含一个长度为 $m$ 的仅由 0 和 1 组成的字符串,表示图片的像素。

输出格式

输出一个整数,表示最少需要翻转多少个像素点,才能使图片对于某个 $k$ 可压缩。

说明/提示

我们首先选择 $k=2$。 图片经过填充后的样子如下: ``` 001000 101100 110010 000000 ``` 我们可以将图片翻转成如下样子: ``` 001100 001100 000000 000000 ``` 可以看出,这张图片对于 $k=2$ 是可以压缩的。 由 ChatGPT 5 翻译