#include <bits/stdc++.h>
using namespace std;
const signed long long int INF = 10e8;
const int N = 2500;
char pole[N * 2][N * 2];
int dp[N * 2][N * 2];
int get(int i, int j, int k) {
  int tmp = dp[i + k - 1][j + k - 1];
  if (i) tmp -= dp[i - 1][j + k - 1];
  if (j) tmp -= dp[i + k - 1][j - 1];
  if (i && j) tmp += dp[i - 1][j - 1];
  if (tmp < 0) {
    return 0;
  }
  return tmp;
}
bool solve() {
  int n, m;
  cin >> n >> m;
  for (int i(0); i < n; i++) {
    for (int j(0); j < m; j++) {
      cin >> pole[i][j];
      dp[i][j] = (pole[i][j] - '0');
    }
  }
  for (int i(0); i < 2 * N; i++) {
    for (int j(0); j < 2 * N; j++) {
      if (i) dp[i][j] += dp[i - 1][j];
      if (j) dp[i][j] += dp[i][j - 1];
      if (i && j) dp[i][j] -= dp[i - 1][j - 1];
    }
  }
  int ans(INF);
  for (int k(2); k <= max(n, m); k++) {
    int cur(0);
    int xn = (n / k) * k + ((n % k) ? 1 : 0) * k;
    int xm = (m / k) * k + ((m % k) ? 1 : 0) * k;
    for (int i(0); i < xn; i += k) {
      for (int j(0); j < xm; j += k) {
        int tmp = get(i, j, k);
        tmp = min(tmp, k * k - tmp);
        cur += tmp;
      }
    }
    ans = min(ans, cur);
  }
  cout << ans;
  return 1;
}
int main() {
  solve();
  return 0;
}
