#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
void Fast(){
ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
}
void File() {
#ifndef ONLINE_JUDGE
freopen("Input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
}
template<class T> using ordered_set = tree<pair<int,int>, null_type,less<pair<int,int>>, rb_tree_tag,tree_order_statistics_node_update>;
typedef long long ll;
#define watch(x) cout << (#x) << " = " << x << '\n'
#define endl '\n'
#define all(a) a.begin(), a.end()
#define fix(n) cout << fixed << setprecision(n)
#define skip continue
const long double pi = acos(-1);
const int dx[] = { 1, 0, -1, 0, 1, 1, -1, -1 };
const int dy[] = { 0, 1, 0, -1, 1, -1, 1, -1 };
int main(){
Fast();
int t;cin >> t;
while(t--){
int n , k;cin >> n >> k;
vector<int>v(n+1) , a(n+1);
map<int,int>mp;
for(int i = 1; i <= n;i++){
cin >> v[i];
v[i] %= k;
a[i] = v[i];
}
for(int i = 1; i <= n;i++){
v[i] += v[i-1];
v[i] %= k;
mp[v[i]]++;
}
int ans = mp[0];
int cnt = 0;
for(int i = n; i >= 1;i--){
cnt += a[i];
cnt %= k;
int x = k - cnt;
ans += mp[x];
mp[v[i]]--;
}
cout << ans << endl;
}
}
Copy