问题分析
这个问题并不是我解出来的,所以直接翻译其解析好了。
首先我们计算A
的前缀和P
。
例如A = [4,5,0,-2,-3,1]
则其前缀和为P = [0,4,9,9,7,4,5]
。之后我们再对前缀和进行取模运算,并记录各个模结果的总数。
其结果为C0 = 2,C2 = 1,C4 = 4。
对于C4 = 4,(位于P[1], P[2], P[3], P[5]
),他指出有如下组合可以使得子序列和能够被K整除,为A[1: 2], A[1:3], A[1:5], A[2:3], A[2:5], A[3:5]
。其为无序排列组合的公式C62的值。
问题的最终答案为C62 +C22
完整代码
class Solution {
public:
int subarraysDivByK(const vector<int>& A, int K) {
vector<int> P(A.size() + 1, 0);
vector<int> count(K, 0);
int result{0};
for(int i = 0; i < A.size(); i++)
P[i + 1] = P[i] + A[i];
for(auto v : P)
count[((v % K) + K) % K]++;
for(auto v : count)
result += v * (v - 1) / 2;
return result;
}
};