let SIZE = 10
function
longSubarrWthSumDivByK(arr, n, k, start, finish)
{
let um = {};
let mod_arr =
new
Array(n);
let curr_sum = 0, max = 0;
for
(let i = 0; i < n; i++) {
curr_sum += arr[i];
mod_arr[i] = ((curr_sum % k) + k) % k;
}
for
(let i = 0; i < n; i++) {
if
(mod_arr[i] == 0) {
max = i + 1;
start = 0;
finish = i;
}
else
if
(!um.hasOwnProperty(mod_arr[i]))
um[mod_arr[i]] = i;
else
{
if
(max < (i - um[mod_arr[i]])) {
max = i - um[mod_arr[i]];
start = um[mod_arr[i]] + 1;
finish = i;
}
}
}
}
function
findLargestSubmatrix(mat, n, k)
{
let finalLeft = 0, finalRight = 0, finalTop = 0, finalBottom = 0;
let left = 0, right = 0, i = 0, maxArea = 0;
let start = 0, finish = 0, temp
for
(left = 0; left < n; left++) {
temp =
new
Array(n).fill(0)
for
(right = left; right < n; right++) {
for
(i = 0; i < n; ++i)
temp[i] += mat[i][right];
longSubarrWthSumDivByK(temp, n, k, start, finish);
if
(maxArea < ((right - left + 1) *
(finish - start + 1))) {
finalLeft = left;
finalRight = right;
finalTop = start;
finalBottom = finish;
maxArea = (right - left + 1) * (finish - start + 1);
}
}
}
console.log(
"(Top, Left): ("
+ finalTop +
", "
+ finalLeft +
")"
);
console.log(
"(Bottom, Right): ("
+ finalBottom +
", "
+ finalRight +
")"
);
console.log(
"Area: "
+ maxArea);
}
let mat = [[ 1, 2, -1, -4 ], [-8, -3, 4, 2], [ 3, 8, 10, 1 ], [-4, -1, 1, 7 ]];
let n = 4, k = 5;
findLargestSubmatrix(mat, n, k);