using
System;
using
System.Collections.Generic;
class
GFG{
static
int
removeSmallestSubarray(
int
[]arr,
int
S,
int
n,
int
k)
{
int
target_remainder = S % k;
Dictionary<
int
,
int
> map1 =
new
Dictionary<
int
,
int
>();
map1.Add(0, -1);
int
curr_remainder = 0;
int
res =
int
.MaxValue;
for
(
int
i = 0; i < n; i++)
{
curr_remainder = (curr_remainder +
arr[i] + k) % k;
map1[curr_remainder]= i;
int
mod = (curr_remainder -
target_remainder +
k) % k;
if
(map1.ContainsKey(mod))
{
res = Math.Min(res, i -
map1[mod]);
}
}
if
(res ==
int
.MaxValue ||
res == n)
{
res = -1;
}
return
res;
}
static
int
smstSubmatDeleted(
int
[,]mat,
int
N,
int
M,
int
K)
{
int
S = 0;
for
(
int
i = 0; i < N; i++)
{
for
(
int
j = 0; j < M; j++)
S += mat[i,j];
}
int
min_area = N * M;
int
left = 0;
int
right = 0;
int
width;
int
area;
int
[]prefixRowSum =
new
int
[N];
for
(left = 0; left < M; left++)
{
for
(
int
i = 0; i < prefixRowSum.Length; i++)
prefixRowSum[i] = 0;
for
(right = left;
right < M; right++)
{
for
(
int
i = 0; i < N; i++)
{
prefixRowSum[i] += mat[i, right];
}
width = removeSmallestSubarray(
prefixRowSum, S, N, K);
if
(width != -1)
{
area = (right - left + 1) *
(width);
if
(area < min_area)
{
min_area = area;
}
}
}
}
return
min_area;
}
public
static
void
Main(String[] args)
{
int
[,] mat = { { 6, 2, 6 },
{ 3, 2, 8 },
{ 2, 5, 3 } };
int
K = 3;
int
N = mat.GetLength(0);
int
M = mat.GetLength(1);
Console.Write(
smstSubmatDeleted(mat, N,
M, K));
}
}