https://www.hackerrank.com/contests/w6/challenges/consecutive-subsequences
求数组中被k整除的子段和有几个。这个要利用sum[i..j] = sum[j] - sum[i-1],注意这样还要保留一个sum[-1]=0(根据下标的起点怎么定)。那么能被k整除的子段sum[i..j]的sum[j]和sum[i-1] %k的值是一样的。
#include <iostream>
#include <vector>
using namespace std;
int main() {
int T;
cin >> T;
while (T--) {
int n, k;
cin >> n >> k;
int sum = 0;
vector<int> cnt(k);
cnt[0] = 1;
for (int i = 0; i < n; i++) {
int tmp;
cin >> tmp;
sum += tmp;
sum %= k;
cnt[sum]++;
}
long long count = 0;
for (int i = 0; i < k; i++) {
count += ((long long)cnt[i] * (cnt[i] - 1) / 2);
}
cout << count << endl;
}
return 0;
}