*[hackerrank]Consecutive Subsequences
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; }