# [974\. Subarray Sums Divisible by K](https://leetcode.com/problems/subarray-sums-divisible-by-k/) 子數列 `[0, i]` 的和子數列 `[0, j]` 的和,除以 `k` 的餘數相同的話,代表 `[i + 1, j]` 的和也可以被 `k` 整除。 舉個例子:`nums = [1, 2, 3, 4]`,`k = 5` - `1` 除以 `5` 餘 `1` - `[1, 2, 3]` 除以 `5`,也餘 1 按照規律,`[2, 3]` 的和一定可以整除 `5` 也就是說,子數列能被 `k` 整除的關鍵是在餘數相不相同。 ```cpp= class Solution { public: int subarraysDivByK(vector<int>& nums, int k) { // 計算子數列能不能被 k 整除 // sum[i : j] 能被 k 整除的條件就是 // prefixSum[i] 和 prefixSum[j - 1] 除以 k 的餘數相同 int res = 0, sum = 0; // 保存 prefixSum 除以 k 的餘數出現多少次 unordered_map<int, int> m{{0, 1}}; for (int num : nums) { // 累加 sum // 加上 k 的原因是確保結果為正整數 // 沒有加上 k,有可能出現負數的情況 sum = (sum + num % k + k) % k; // 加上相同餘數對應的頻率 res += m[sum]; // 餘數出現的頻率 + 1 ++m[sum]; } return res; } }; ``` :::success - 時間複雜度:$O(n + k)$ - 空間複雜度:$O(n)$ :::