#pragma GCC optimize("O3,inline")
#include <bits/stdc++.h>
using namespace std;
#define int long long
bool comp(pair<vector<int>, int>& a, pair<vector<int>, int>& b) {
int sa = 0, sb = 0;
for (int i : a.first) sa += i;
for (int i : b.first) sb += i;
if (sa == sb) return a.second > b.second;
return sa < sb;
}
signed main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int N, M, K, a, ans = 0; cin >> N >> M >> K;
if (N == 2) {
int s1 = 0, s2 = 0, swapped = 0;
vector<int> A1, A2;
for (int i = 0; i < M; i++) {
cin >> a;
A1.push_back(a);
s1 += a;
}
for (int i = 0; i < M; i++) {
cin >> a;
A2.push_back(a);
s2 += a;
}
if (s1 >= s2) {
swap(A1, A2);
swapped = 1;
}
sort(A1.begin(), A1.end(), greater<int>());
sort(A2.begin(), A2.end());
for (int i = 0; i <= M; i++) {
for (int j = 0; j <= M; j++) {
pair<int, int> r1 = { 0, i * K }, r2 = { 0, j * K };
for (int k = i; k < M; k++) r1.first += A1[k], r1.second += A1[k];
for (int k = j; k < M; k++) r2.first += A2[k], r2.second += A2[k];
if (r1.second < r2.first || (r1.second == r2.first && swapped)) ans = max(ans, i + j);
}
}
cout << N * M - ans << '\n';
return 0;
}
if (N * M <= 16) {
vector<pair<vector<int>, int>> A(N, pair<vector<int>, int>(vector<int>(M, 0), 0));
for (int i = 0; i < N; i++) {
A[i].second = i;
for (int j = 0; j < N; j++) {
cin >> a;
A[i].first[j] = a;
}
}
sort(A.begin(), A.end(), comp);
for (int i = 0; i < (1LL << (N * M)); i++) {
vector<pair<int, int>> rs(N, pair<int, int>(0, 0));
int crnt = 0;
for (int j = 0; j < N; j++) {
for (int k = 0; k < M; k++) {
if (!(i & (1LL << (j * M + k)))) {
rs[j].second += K;
crnt++;
continue;
}
rs[j].first += A[j].first[k], rs[j].second += A[j].first[k];
}
}
int die = 0;
for (int j = 0; j < N - 1; j++) {
if (rs[j].second < rs[j + 1].first || (rs[j].second == rs[j + 1].first && A[j].second > A[j + 1].second)) continue;
die = 1;
break;
}
if (!die) ans = max(ans, crnt);
}
cout << N * M - ans << '\n';
return 0;
}
vector<pair<vector<int>, int>> A(N, pair<vector<int>, int>(vector<int>(M, 0), 0));
vector<int> sums;
for (int i = 0; i < N; i++) {
A[i].second = i;
int csum = 0;
for (int j = 0; j < M; j++) {
cin >> a;
A[i].first[j] = a;
csum += a;
}
sums.push_back(csum);
}
sort(A.begin(), A.end(), comp);
sort(sums.begin(), sums.end());
for (int i = 0; i < M; i++)
ans += A[0].first[i] + (1 - A.back().first[i]);
for (int i = 1; i < N; i++) {
int s1 = 0, s2 = 0;
for (int j = 0; j < M; j++) s1 += 1 - A[i - 1].first[j], s2 += A[i].first[j];
ans += min(sums[i] - sums[i - 1] - (A[i].second > A[i - 1].second), s1 + s2);
}
cout << N * M - ans << '\n';
}