Subarray Sums Divisible by K

medium prefix sum hash map modular arithmetic

Problem

Given an integer array nums and an integer k, return the number of contiguous, non-empty subarrays that have a sum divisible by k.

Inputnums = [4, 5, 0, -2, -3, 1], k = 5
Output7
The 7 subarrays with a sum divisible by 5 include [5], [5, 0], [0], [5, 0, -2, -3], and others.

def subarrays_div_by_k(nums, k):
    counts = {0: 1}
    prefix = 0
    total = 0
    for x in nums:
        prefix += x
        r = prefix % k
        total += counts.get(r, 0)
        counts[r] = counts.get(r, 0) + 1
    return total
function subarraysDivByK(nums, k) {
  const counts = new Map([[0, 1]]);
  let prefix = 0, total = 0;
  for (const x of nums) {
    prefix += x;
    const r = ((prefix % k) + k) % k;
    total += counts.get(r) || 0;
    counts.set(r, (counts.get(r) || 0) + 1);
  }
  return total;
}
class Solution {
    public int subarraysDivByK(int[] nums, int k) {
        Map<Integer, Integer> counts = new HashMap<>();
        counts.put(0, 1);
        int prefix = 0, total = 0;
        for (int x : nums) {
            prefix += x;
            int r = ((prefix % k) + k) % k;
            total += counts.getOrDefault(r, 0);
            counts.put(r, counts.getOrDefault(r, 0) + 1);
        }
        return total;
    }
}
int subarraysDivByK(vector<int>& nums, int k) {
    unordered_map<int, int> counts;
    counts[0] = 1;
    int prefix = 0, total = 0;
    for (int x : nums) {
        prefix += x;
        int r = ((prefix % k) + k) % k;
        total += counts[r];
        counts[r]++;
    }
    return total;
}
Time: O(n) Space: O(k)