let dp =
new
Array(101);
for
(let i = 0; i < dp.length; i++) {
dp[i] =
new
Array(101);
}
for
(let i = 0; i < 101; i++) {
for
(let j = 0; j < 101; j++) {
dp[i][j] =
new
Array(101).fill(-1)
}
}
function
recur(i, sum, XOR, arr, N, M) {
if
(i == N) {
if
(sum != 0 || XOR != 0)
return
-1e9
return
0
}
if
(dp[i][sum][XOR] != -1)
return
dp[i][sum][XOR]
let ans = recur(i + 1, sum, XOR, arr, N, M)
let save = recur(i + 1, (sum + arr[i]) % M,
(XOR ^ arr[i]), arr, N, M)
if
(save != -1e9)
ans = Math.max(ans, save + arr[i])
return
dp[i][sum][XOR] = ans
}
function
maxSumDivisibleByM(arr, N, M) {
let ans = recur(0, 0, 0, arr, N, M)
if
(ans == -1e9)
console.log(-1)
else
console.log(ans)
}
let arr = [2, 3, 2, 5, 5]
let M = 5
let N = arr.length
maxSumDivisibleByM(arr, N, M)
for
(let i = 0; i < 101; i++) {
for
(let j = 0; j < 101; j++) {
for
(let k = 0; k < 101; k++)
dp[i][j][k] = -1;
}
}
let arr1 = [7, 7, 1, 2, 3]
let M1 = 5
let N1 = arr1.length
maxSumDivisibleByM(arr1, N1, M1)