Source Code
#define _CRT_SECURE_NO_WARNINGS
#include <utility>
#include <string.h>
#include <string>
#include <math.h>
#include <stack>
#include <set>
#include <map>
#include <queue>
#include <deque>
#include <iterator>
#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_map>
#include <bitset>
#include <time.h>
#include <stdlib.h>
 
using namespace std;
const long long INF = 1ll << 32;
const double PI = acos(-1);
typedef long long ll;
typedef long double ld;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<bool> vb;
typedef pair<int, int>pi;
typedef pair<ll, ll>pl;
typedef vector<pi>vpi;
typedef vector<pl>vpl;
typedef vector<vi> vvi;
typedef vector<vb> vvb;
typedef vector<vl> vvl;
typedef vector<string> vs;
int dc[] = { 0,0,1,-1 }, dr[] = { 1,-1,0,0 };
#define all(v) (v).begin(),(v).end()
#define rall(v) (v).rbegin(),(v).rend()
#define read(v) for (int it = 0; it < v.size(); it++) {scanf("%d", &v[it]);}
#define print(v) for(auto it : v) printf("%lld ", it); puts("");
#define readL(v) for (int it = 0; it < v.size(); it++) scanf("%lld", &v[it]);
#define printL(v) for (auto it : v) printf("%lld ", it); puts("");
#define readC(v) for (int it = 0; it < v.size(); it++) {scanf("%c", &v[it]);}
#define printC(v) for(auto it : v) printf("%c ", it); puts("");

void solve (){
    int n,k;
    scanf ("%d %d",&n,&k);
    vl cs(n+1);
    for (int i=1,a;i<=n;i++){
        scanf ("%d",&a);
        cs[i]=cs[i-1]+a;
    }
    vl cs2 (n+1);
    cs2[n]=0;
    map<ll,int> mp1,mp2;
    for (int i=n-1;i>=0;i--){
        cs2[i]=cs[n]-cs[i];
        mp1[cs2[i]%k]++;
    }
    ll ans =0;
    for (int i=1;i<=n;i++){
        mp2[cs2[i-1]%k]++;
        ans += mp1[(k-cs[i]%k)%k]-mp2[(k-cs[i]%k)%k];
    }
    printf ("%lld\n",ans);
}
int main(void) {
    int t;
    scanf ("%d",&t);
    while (t--)
    {
        solve();
    }
    
	return 0;
}
Copy
Number of Ways Enigma
GNU G++17
1094 ms
53.4 MB
Accepted