#include<iostream>#include<string.h>usingnamespace std;int nums[600][600];// 记录输入的矩阵int dp[600];// 记录第一行块的数和int n, L, r, t;introwNum(){// 求出第一行块int pre =0;// 块尾要删除的值int form =0;// 块头要增加的值int num =(r +1)*(r +1);// 块的大小int ans =0;for(int i =0; i <= r;++i){// 第一个块for(int j =0; j<= r;++j){
dp[0]+= nums[i][j];}}if(dp[0]<= t*num){
ans =1;}for(int j =1; j < n;++j){
form =0;if(j + r < n){for(int i =0; i <= r;++i){
form += nums[i][j + r];}
num += r +1;}
dp[j]= dp[j -1]+ form - pre;if(dp[j]<= t * num){
ans++;}if(j - r >=0){
pre =0;
num -= r +1;for(int i =0; i <= r;++i){
pre += nums[i][j - r];}}}return ans;}intcolNum(int j){// 求出各个行块对应的列块int pre =0;int form =0;int ans =0;int left = j - r >=0? j - r :0;int right = j + r < n ? j + r : n -1;int width = right - left +1;int num =(r +1)* width;for(int x =1; x < n;++x){
form =0;if(x + r < n){for(int t = left; t <= right;++t){
form += nums[x + r][t];}
num += width;}
dp[j]+= form - pre;if(dp[j]<= num * t){
ans++;}if(x - r >=0){
pre =0;
num -= width;for(int t = left; t <= right;++t){
pre += nums[x - r][t];}}}return ans;}intmain(){int ans =0;memset(nums,0,sizeof(nums));memset(dp,0,sizeof(dp));scanf("%d%d%d%d",&n,&L,&r,&t);for(int i =0; i < n;++i){for(int j =0; j < n;++j){scanf("%d",&nums[i][j]);}}if(n <= r +1){// 特殊的小块
ans = n * n;}else{
ans +=rowNum();for(int j =0; j < n;++j){
ans +=colNum(j);}}printf("%d", ans);return0;}