给定一个整数数组 A
,返回其中元素之和可被 K
整除的(连续、非空)子数组的数目。
输入:A = [4,5,0,-2,-3,1], K = 5
输出:7
解释:
有 7 个子数组满足其元素之和可被 K = 5 整除:
[4, 5, 0, -2, -3, 1], [5], [5, 0], [5, 0, -2, -3], [0], [0, -2, -3], [-2, -3]
sum(A[i : j + 1]) = s[j + 1] - s[i]
如果sum(A[i : j + 1])%k=0,那么s[j + 1]%k=s[i]%k
所以,要找在范围n之中有多少对相同余数的前缀和
class Solution {
public:
int subarraysDivByK(vector<int>& A, int K) {
int* dp = new int[K];
memset(dp, 0, K * sizeof(int));
dp[0]++;
int sum = 0, pre = 0;
for(auto v : A)
{
pre = (pre + v) % K;
if(pre < 0)
pre += K;
sum += dp[pre];
dp[pre]++;
}
return sum;
}
};