#include<bits/stdc++.h>
#define TIME (1.0* clock()/CLOCKS_PER_SEC)
#define pb push_back
#define eb emplace_back
#define id1 (id<<1)
#define id2 (id<<1)|1
#define ll long long
#define ii pair<int,int>
#define vi vector<int>
#define vii vector<pair<int,int>>
#define vl vector<long long>
#define vll vector <pair<ll,ll>>
#define li pair<long long,int>
#define vil vector <pair<int,ll>>
#define db double
#define ff first
#define ss second
#define lb lower_bound
#define ub upper_bound
#define FOR(i, a, b) for (int i = (a); i <=(b); i++)
#define F0R(i, a) FOR(i, 0, a-1)
#define ROF(i, a, b) for (int i = (b); i >= (a); i--)
#define R0F(i, a) ROF(i, 0, a-1)
#define rep(a) F0R(_, a)
#define each(a, x) for (auto &a : x)
#define ALL(x) (x).begin(),(x).end()
#define pq priority_queue <li, vector <li>, greater <li>>
using namespace std;
const int maxn=1e6;
//const int MOD=1e9+7;
//const int MOD=998244353;
//const int dx[4]{1, 0, -1, 0}, dy[4]{0, 1, 0, -1};
#define int long long
int n,d;
int res;
int a[maxn],pre[maxn],cnt[maxn];
void solve(){
cin>>n>>d;
cnt[pre[0]]=1;
for(int i=1;i<=n;i++){
int x;
cin>>x;
pre[i]=pre[i-1]+x;
pre[i]=((pre[i]%d)+d)%d;
res+=cnt[pre[i]];
cnt[pre[i]]++;
}
cout<<res;
return;
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);cout.tie(NULL);
if (fopen("TASK.INP", "r")){
freopen("TASK.INP", "r", stdin);
freopen("TASK.OUT", "w", stdout);
}
int ntest;
ntest=1;
cin>>ntest;
for(int i=1;i<=ntest;i++) solve();
cerr<<"\n"<<"Time elapsed "<<TIME<<"s.\n";
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KI2RlZmluZSBUSU1FICgxLjAqIGNsb2NrKCkvQ0xPQ0tTX1BFUl9TRUMpCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgZWIgZW1wbGFjZV9iYWNrCiNkZWZpbmUgaWQxIChpZDw8MSkKI2RlZmluZSBpZDIgKGlkPDwxKXwxCiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgaWkgcGFpcjxpbnQsaW50PgojZGVmaW5lIHZpIHZlY3RvcjxpbnQ+CiNkZWZpbmUgdmlpIHZlY3RvcjxwYWlyPGludCxpbnQ+PiAKI2RlZmluZSB2bCB2ZWN0b3I8bG9uZyBsb25nPgojZGVmaW5lIHZsbCB2ZWN0b3IgPHBhaXI8bGwsbGw+PgojZGVmaW5lIGxpIHBhaXI8bG9uZyBsb25nLGludD4KI2RlZmluZSB2aWwgdmVjdG9yIDxwYWlyPGludCxsbD4+CiNkZWZpbmUgZGIgZG91YmxlCiNkZWZpbmUgZmYgZmlyc3QKI2RlZmluZSBzcyBzZWNvbmQKI2RlZmluZSBsYiBsb3dlcl9ib3VuZAojZGVmaW5lIHViIHVwcGVyX2JvdW5kCiNkZWZpbmUgRk9SKGksIGEsIGIpIGZvciAoaW50IGkgPSAoYSk7IGkgPD0oYik7IGkrKykKI2RlZmluZSBGMFIoaSwgYSkgRk9SKGksIDAsIGEtMSkKI2RlZmluZSBST0YoaSwgYSwgYikgZm9yIChpbnQgaSA9IChiKTsgaSA+PSAoYSk7IGktLSkKI2RlZmluZSBSMEYoaSwgYSkgUk9GKGksIDAsIGEtMSkKI2RlZmluZSByZXAoYSkgRjBSKF8sIGEpCiNkZWZpbmUgZWFjaChhLCB4KSBmb3IgKGF1dG8gJmEgOiB4KQojZGVmaW5lIEFMTCh4KSAoeCkuYmVnaW4oKSwoeCkuZW5kKCkKI2RlZmluZSBwcSBwcmlvcml0eV9xdWV1ZSA8bGksIHZlY3RvciA8bGk+LCBncmVhdGVyIDxsaT4+IAp1c2luZyBuYW1lc3BhY2Ugc3RkOwpjb25zdCBpbnQgbWF4bj0xZTY7Ci8vY29uc3QgaW50IE1PRD0xZTkrNzsKLy9jb25zdCBpbnQgTU9EPTk5ODI0NDM1MzsKLy9jb25zdCBpbnQgZHhbNF17MSwgMCwgLTEsIDB9LCBkeVs0XXswLCAxLCAwLCAtMX07CiNkZWZpbmUgaW50IGxvbmcgbG9uZwppbnQgbixkOwppbnQgcmVzOwoKaW50IGFbbWF4bl0scHJlW21heG5dLGNudFttYXhuXTsKCgp2b2lkIHNvbHZlKCl7CiAgIGNpbj4+bj4+ZDsKICAgY250W3ByZVswXV09MTsKICAgZm9yKGludCBpPTE7aTw9bjtpKyspewogICAJIGludCB4OwogICAJIGNpbj4+eDsKICAgCSBwcmVbaV09cHJlW2ktMV0reDsKICAgCSBwcmVbaV09KChwcmVbaV0lZCkrZCklZDsKICAgCSByZXMrPWNudFtwcmVbaV1dOwogICAJIGNudFtwcmVbaV1dKys7CiAgIAkgCiAgIH0KICAgY291dDw8cmVzOwogICByZXR1cm47Cn0Kc2lnbmVkIG1haW4oKXsKICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICBjaW4udGllKE5VTEwpO2NvdXQudGllKE5VTEwpOwogIGlmIChmb3BlbigiVEFTSy5JTlAiLCAiciIpKXsKICAgICAgZnJlb3BlbigiVEFTSy5JTlAiLCAiciIsIHN0ZGluKTsKICAgICAgZnJlb3BlbigiVEFTSy5PVVQiLCAidyIsIHN0ZG91dCk7CiAgfQogIGludCBudGVzdDsKICBudGVzdD0xOwogIGNpbj4+bnRlc3Q7CiAgCiAgZm9yKGludCBpPTE7aTw9bnRlc3Q7aSsrKSBzb2x2ZSgpOwogIGNlcnI8PCJcbiI8PCJUaW1lIGVsYXBzZWQgIjw8VElNRTw8InMuXG4iOwogIHJldHVybiAwOwp9