#include<bits/stdc++.h>
using namespace std;
///***********SEXY & I KNOW IT******************///
#define uli unsigned long long int
///***input******// for +ve int
inline uli in() {
uli p=0; register char ch=0;
while(ch<'0' or ch>'9') {ch=getchar();}
while(ch>='0' and ch<='9') {p=(p<<1)+(p<<3)+ch-'0'; ch=getchar();}
return p;
}
///***output*****// for +ve int
#define pc(x) putchar(x)
inline void dukya(uli n){
uli N = n, rev, count_ = 0;
rev = N;
if (N == 0) { pc('0'); pc('\n'); return ;}
while ((rev % 10) == 0) { count_++; rev /= 10;}
rev = 0;
while (N != 0) { rev = (rev<<3) + (rev<<1) + N % 10; N /= 10;}
while (rev != 0) { pc(rev % 10 + '0'); rev /= 10;}
while (count_--) pc('0');
pc('\n');
}
///
#define li long long int
#define ld long double
#define lega(n) scanf("%lld", &n)
#define dley(n, m) scanf("%lld %lld", &n, &m)
#define dega(n) printf("%lld\n", n)
#define chal(n) for(li i=0;i<n; ++i)
#define FOR(i, n, c) for(i=c; i<n; i++)
#define fpos(n) for(auto pos=n.begin(); pos!=n.end(); ++pos)
#define frng(n) for(auto val : n)
#define ot(n) cout<<n<<"\n"
#define wl(n) while(n--)
#define vs vector<string>
#define vi vector<li>
#define ii pair<li, li>
#define mii map<ii, li>
#define mli map<li, li>
#define met multiset<li>
#define p_b(n) push_back(n)
#define ict int test_case=in(); wl(test_case)
#define INF 1000000009
#define mod 1000000007
#define EPS 0;.000000001
#define lipos(s) s&-s
#define fastScan ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL)
///****************************************///
void maxSubarray(vi arr, li n, li m)
{
li x, prefix = 0, maxim = 0;
set<li> S;
S.insert(0);
map<li, li> mm;
vi pre;
li co=0;
for (li i = 0; i < n; i++)
{
prefix = (prefix + arr[i])%m;
auto it = S.upper_bound(prefix);
maxim=max(maxim, prefix);
if (it != S.end())
{
maxim=max(maxim, (prefix - (*it) + m));
}
S.insert(prefix);
pre.push_back(prefix);
}
mm[0]++;
chal(n)
{
if((pre[i]-maxim)>=0)
co+=mm[pre[i]-maxim];
co+=mm[pre[i]-maxim+m];
mm[pre[i]]++;
}
ot(maxim<<" "<<co);
return;
}
int main()
{
ict
{
li n=in();
li p=in();
vi A;
chal(n)
A.push_back(in());
maxSubarray(A, n, p);
}
}
ICAgICNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CiAgICAgCiAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOwogICAgIAogICAgLy8vKioqKioqKioqKipTRVhZICYgSSBLTk9XIElUKioqKioqKioqKioqKioqKioqLy8vCiAgICAjZGVmaW5lIHVsaSB1bnNpZ25lZCBsb25nIGxvbmcgaW50CiAgICAvLy8qKippbnB1dCoqKioqKi8vIGZvciArdmUgaW50CiAgICBpbmxpbmUgdWxpIGluKCkgewogICAgICAgIHVsaSBwPTA7IHJlZ2lzdGVyIGNoYXIgY2g9MDsKICAgICAgICB3aGlsZShjaDwnMCcgb3IgY2g+JzknKSB7Y2g9Z2V0Y2hhcigpO30KICAgICAgICB3aGlsZShjaD49JzAnIGFuZCBjaDw9JzknKSB7cD0ocDw8MSkrKHA8PDMpK2NoLScwJzsgY2g9Z2V0Y2hhcigpO30KICAgICAgICByZXR1cm4gcDsKICAgIH0KICAgIC8vLyoqKm91dHB1dCoqKioqLy8gZm9yICt2ZSBpbnQKICAgICNkZWZpbmUgcGMoeCkgcHV0Y2hhcih4KQogICAgaW5saW5lIHZvaWQgZHVreWEodWxpIG4pewogICAgICAgICAgICB1bGkgTiA9IG4sIHJldiwgY291bnRfID0gMDsKICAgICAgICAgICAgcmV2ID0gTjsKICAgICAgICAgICAgaWYgKE4gPT0gMCkgeyBwYygnMCcpOyBwYygnXG4nKTsgcmV0dXJuIDt9CiAgICAgICAgICAgIHdoaWxlICgocmV2ICUgMTApID09IDApIHsgY291bnRfKys7IHJldiAvPSAxMDt9CiAgICAgICAgICAgIHJldiA9IDA7CiAgICAgICAgICAgIHdoaWxlIChOICE9IDApIHsgcmV2ID0gKHJldjw8MykgKyAocmV2PDwxKSArIE4gJSAxMDsgTiAvPSAxMDt9CiAgICAgICAgICAgIHdoaWxlIChyZXYgIT0gMCkgeyBwYyhyZXYgJSAxMCArICcwJyk7IHJldiAvPSAxMDt9CiAgICAgICAgICAgIHdoaWxlIChjb3VudF8tLSkgcGMoJzAnKTsKICAgICAgICAgICAgcGMoJ1xuJyk7CiAgICAgICAgfQogICAgLy8vCiAgICAjZGVmaW5lIGxpICBsb25nIGxvbmcgaW50CiAgICAjZGVmaW5lIGxkIGxvbmcgZG91YmxlCiAgICAjZGVmaW5lIGxlZ2Eobikgc2NhbmYoIiVsbGQiLCAmbikKICAgICNkZWZpbmUgZGxleShuLCBtKSBzY2FuZigiJWxsZCAlbGxkIiwgJm4sICZtKQogICAgI2RlZmluZSBkZWdhKG4pIHByaW50ZigiJWxsZFxuIiwgbikKICAgICNkZWZpbmUgY2hhbChuKSBmb3IobGkgaT0wO2k8bjsgKytpKQogICAgI2RlZmluZSBGT1IoaSwgbiwgYykgZm9yKGk9YzsgaTxuOyBpKyspCiAgICAjZGVmaW5lIGZwb3MobikgZm9yKGF1dG8gcG9zPW4uYmVnaW4oKTsgcG9zIT1uLmVuZCgpOyArK3BvcykKICAgICNkZWZpbmUgZnJuZyhuKSBmb3IoYXV0byB2YWwgOiBuKQogICAgI2RlZmluZSBvdChuKSBjb3V0PDxuPDwiXG4iCiAgICAjZGVmaW5lIHdsKG4pIHdoaWxlKG4tLSkKICAgICNkZWZpbmUgdnMgdmVjdG9yPHN0cmluZz4KICAgICNkZWZpbmUgdmkgdmVjdG9yPGxpPgogICAgI2RlZmluZSBpaSBwYWlyPGxpLCBsaT4KICAgICNkZWZpbmUgbWlpIG1hcDxpaSwgbGk+CiAgICAjZGVmaW5lIG1saSBtYXA8bGksIGxpPgogICAgI2RlZmluZSBtZXQgbXVsdGlzZXQ8bGk+CiAgICAjZGVmaW5lIHBfYihuKSBwdXNoX2JhY2sobikKICAgICNkZWZpbmUgaWN0IGludCB0ZXN0X2Nhc2U9aW4oKTsgd2wodGVzdF9jYXNlKQogICAgI2RlZmluZSBJTkYgMTAwMDAwMDAwOQogICAgI2RlZmluZSBtb2QgMTAwMDAwMDAwNwogICAgI2RlZmluZSBFUFMgMDsuMDAwMDAwMDAxCiAgICAjZGVmaW5lIGxpcG9zKHMpIHMmLXMKICAgICNkZWZpbmUgZmFzdFNjYW4gaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsgY2luLnRpZShOVUxMKTsgY291dC50aWUoTlVMTCkKICAgIC8vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLy8KICAgIHZvaWQgbWF4U3ViYXJyYXkodmkgYXJyLCBsaSBuLCBsaSBtKQogICAgewogICAgICAgIGxpIHgsIHByZWZpeCA9IDAsIG1heGltID0gMDsKICAgICAKICAgICAgICBzZXQ8bGk+IFM7CiAgICAgICAgUy5pbnNlcnQoMCk7CiAgICAgICAgbWFwPGxpLCBsaT4gbW07CiAgICAgICAgdmkgcHJlOwogICAgICAgbGkgY289MDsKICAgICAgICBmb3IgKGxpIGkgPSAwOyBpIDwgbjsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgcHJlZml4ID0gKHByZWZpeCArIGFycltpXSklbTsKICAgICAgICAgICAgYXV0byBpdCA9IFMudXBwZXJfYm91bmQocHJlZml4KTsKICAgICAgICAgICAgbWF4aW09bWF4KG1heGltLCBwcmVmaXgpOwogICAgICAgICAgICBpZiAoaXQgIT0gUy5lbmQoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtYXhpbT1tYXgobWF4aW0sIChwcmVmaXggLSAoKml0KSArIG0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgUy5pbnNlcnQocHJlZml4KTsKICAgICAgICAgICAgcHJlLnB1c2hfYmFjayhwcmVmaXgpOwogICAgICAgIH0KICAgICAgICBtbVswXSsrOwogICAgICAgIGNoYWwobikKICAgICAgICB7CiAgICAgICAgICAgIGlmKChwcmVbaV0tbWF4aW0pPj0wKQogICAgICAgICAgICAgICAgY28rPW1tW3ByZVtpXS1tYXhpbV07CiAgICAgICAgICAgIGNvKz1tbVtwcmVbaV0tbWF4aW0rbV07CiAgICAgICAgICAgIG1tW3ByZVtpXV0rKzsKICAgICAgICB9CiAgICAgIG90KG1heGltPDwiICI8PGNvKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpbnQgbWFpbigpCiAgICB7CiAgICAgICAgaWN0CiAgICAgICAgewogICAgICAgICAgICBsaSBuPWluKCk7CiAgICAgICAgICAgbGkgcD1pbigpOwogICAgICAgICAgICB2aSBBOwogICAgICAgICAgICBjaGFsKG4pCiAgICAgICAgICAgIEEucHVzaF9iYWNrKGluKCkpOwogICAgICAgICAgICBtYXhTdWJhcnJheShBLCBuLCBwKTsKICAgICAKICAgICAgICB9CiAgICB9CiAgICAg