問題分析
這個問題並不是我解出來的,所以直接翻譯其解析好了。
首先我們計算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;
}
};