#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 a[maxn];
void solve(){
cin>>n>>d;
unordered_map<int,int> cnt;
int res = 0;
int pref = 0;
cnt[pref] = 1;
for(int i=1;i<=n;i++){
int x;
cin>>x;
pref = (pref + x) % d;
if(pref < 0) pref += d;
res += cnt[pref];
cnt[pref]++;
}
cout<<res<<"\n";
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+IAp1c2luZyBuYW1lc3BhY2Ugc3RkOwpjb25zdCBpbnQgbWF4bj0xZTY7Ci8vY29uc3QgaW50IE1PRD0xZTkrNzsKLy9jb25zdCBpbnQgTU9EPTk5ODI0NDM1MzsKLy9jb25zdCBpbnQgZHhbNF17MSwgMCwgLTEsIDB9LCBkeVs0XXswLCAxLCAwLCAtMX07CiNkZWZpbmUgaW50IGxvbmcgbG9uZwoKaW50IG4sZDsKaW50IGFbbWF4bl07Cgp2b2lkIHNvbHZlKCl7CiAgIGNpbj4+bj4+ZDsKICAgCiAgIHVub3JkZXJlZF9tYXA8aW50LGludD4gY250OwogICBpbnQgcmVzID0gMDsKICAgaW50IHByZWYgPSAwOyAKICAgY250W3ByZWZdID0gMTsKICAgZm9yKGludCBpPTE7aTw9bjtpKyspewogICAJIGludCB4OwogICAJIGNpbj4+eDsKICAgCSBwcmVmID0gKHByZWYgKyB4KSAlIGQ7CiAgIAkgaWYocHJlZiA8IDApIHByZWYgKz0gZDsKICAgCSByZXMgKz0gY250W3ByZWZdOwogICAJIGNudFtwcmVmXSsrOwogICB9CiAgIGNvdXQ8PHJlczw8IlxuIjsKICAgcmV0dXJuOwp9CnNpZ25lZCBtYWluKCl7CiAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgY2luLnRpZShOVUxMKTtjb3V0LnRpZShOVUxMKTsKICBpZiAoZm9wZW4oIlRBU0suSU5QIiwgInIiKSl7CiAgICAgIGZyZW9wZW4oIlRBU0suSU5QIiwgInIiLCBzdGRpbik7CiAgICAgIGZyZW9wZW4oIlRBU0suT1VUIiwgInciLCBzdGRvdXQpOwogIH0KICBpbnQgbnRlc3Q7CiAgbnRlc3Q9MTsKICBjaW4+Pm50ZXN0OwogIAogIGZvcihpbnQgaT0xO2k8PW50ZXN0O2krKykgc29sdmUoKTsKICBjZXJyPDwiXG4iPDwiVGltZSBlbGFwc2VkICI8PFRJTUU8PCJzLlxuIjsKICByZXR1cm4gMDsKfQo=