#include <bits/stdc++.h>
using namespace std;
int n, l, a[104][104], b[104][104], ret;
void sol(int a[104][104]) {
for (int i = 0; i < n; i++) {
int cnt = 1; // cnt 가 1일때는 현재 자리에 슬라이드가 안깔려 있는 맨 땅임, 또 앞으로는 j + 1을 바로 읽기 때문에 1을 초기값으로 설정함
int j; // 한 행이 끝나면 그 길의 끝까지 도달했는지 체크하기 위해 for문에서 뺐음
for (j = 0; j < n - 1; j++) { // + 1 한 위치를 보므로 경계값 - 1 해둔다
if (a[i][j] == a[i][j + 1]) {
cnt++;
}
else if (a[i][j] + 1 == a[i][j + 1] && cnt >= l ) { // 앞 칸이 + 1높이 이고 && 뒤를 봤을 때 지나온 길에 오르막을 만들 수 있는지 (l 보다 현재까지 지나온 길이 길거나 같으면 놓을 수 있음)
cnt = 1; // 지나온 길 카운팅 리셋, cnt 가 1일때는 현재 자리에 경사로가 안깔려 있는 맨 땅임
}
else if (a[i][j] - 1 == a[i][j + 1] && cnt >= 0) { // 앞칸이 -1 높이이고 && 현재 자리에 경사로를 깔지 않은 상태 일때만 가능 (cnt가 음수일 경우엔 이전에 깔았던 내리막이 아직 안끝난 자리임, 그러므로 현재 자리는 빈땅이 아니므로 내리막을 놓을 수 없음)
cnt = -l + 1; // 앞으로 l 칸만큼 깔아줌, + 1 한 이유는 앞에서도 이야기 했듯이 j + 1을 바로 읽기 때문에 1을 초기값으로 생각한다.
}
else break;
}
if (j == n - 1 && cnt >= 0) { // 한 행이 무사히 끝 && 마지막 칸에 무사히 경사로의 끝이던가 아니면 맨땅이던가
ret++;
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> n >> l;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
cin >> a[i][j];
b[j][i] = a[i][j];
}
}
sol(a);
sol(b);
cout << ret << "\n";
return 0;
}