#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; const int MaxN = 1e3 + 10; const int MOD = 1e9 + 7; const int INF = 1e9; int n, m, s[MaxN][MaxN]; char str[MaxN][MaxN]; bitset < MaxN > bit[MaxN]; int get(int a, int b, int c, int d) { return s[c][d] ^ s[a - 1][d] ^ s[c][b - 1] ^ s[a - 1][b - 1]; } int main() { // freopen("input.txt", "r", stdin); scanf("%d%d\n", &n, &m); for (int i = 1; i <= n; ++i) { gets(str[i] + 1); } // S[c][d] xor S[a][d] xor S[c][b] xor S[a][b] = 0 for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { s[i][j] = str[i][j] - '0'; s[i][j] ^= s[i - 1][j]; s[i][j] ^= s[i][j - 1]; s[i][j] ^= s[i - 1][j - 1]; } } for (int j = 0; j <= m; ++j) { for (int i = 0; i <= n; ++i) { bit[j][i] = s[i][j]; } } long long ans = 0; for (int j = 0; j <= m; ++j) { for (int k = j + 1; k <= m; ++k) { int x = (bit[j] ^ bit[k]).count(), y = n + 1 - x; ans += x * (x - 1) / 2 + y * (y - 1) / 2; } } cout << ans << '\n'; return 0; }