*[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;

}

  

你可能感兴趣的:(sequence)