/**
 * @param {number[]} A
 * @param {number} K
 * @return {number}
 */

//iterative O(n^2) runtime. Won't pass leetcode 'Status: Time Limit Exceeded'
var subarraysDivByK = function (A, K) {
	let count = 0
	const sum = []
	A.forEach((curr) => {
		sum.push(0)
		sum.forEach((elem, j) => {
			sum[j] = curr + elem
			if (sum[j] % K === 0 || sum[j] % K === -0) {
				count++
			}
		})
	})

	return count
}

//https://leetcode.com/problems/subarray-sums-divisible-by-k/discuss/217980/Java-O(N)-with-HashMap-and-prefix-Sum
var subarraysDivByK = function (A, K) {
	const map = { 0: 1 }
	let count = 0,
		sum = 0

	A.forEach((elem, i) => {
		sum = (elem + sum) % K
		sum = sum < 0 ? sum + K : sum
		if (map[sum]) {
			val = map[sum]
			count += val
			map[sum]++
		} else {
			map[sum] = 1
		}
	})
	//Test cases
	console.log(map)
	return count
}

// 450015000
arr = new Array(30000).fill(0)
// console.log(arr.length)
console.log(subarraysDivByK([-14, 5, 0, -10, -2, -3, 1], 5))
// console.log(subarraysDivByK([], 5))
// console.log(subarraysDivByK([-1, 2, 9], 2))

// console.log(subarraysDivByK(arr, 1000))
arr = [2, -2, 2, -4]

// console.log(subarraysDivByK(arr, 6))