include [HTML_REMOVED]
include [HTML_REMOVED]
using namespace std;
include [HTML_REMOVED]
typedef long long int ll;
const int N = 2e6;
ll p[2N];//存放数组
ll w[2N];//存放前缀和,因为2e5*1e9超出int了
int main()
{
int t;cin>>t;
while(t–)
{
int n,m;cin>>n>>m;
for(int i = 1;i<=n;i++)
{cin>>p[i];p[i]%=m;}
sort(p+1,p+1+n);//对mol后的数组排序,对于一个序列,要找到其中一个值,保证所有值减去他之后的绝对值和最小
//那么肯定是先从小到大排序,然后找到中间值,这样找出来的肯定是最小的。
for(int i = 1;i<=n;i++) p[i+n] = p[i]+m;//每次断环成链,其实我们都是用其他n-1个点的值减去对应的x,也是中间点,
//对于一个链,我们知道每一次断链,这个x已经在中间位置了,那么我们现在要保证这个断后的序列他的他也是从小到大的
//这样的话才能保证我们求出来的是最小值。所以我们在后面再加上一条长度为n的序列,并加上m,这样保证递增同时不影响他原本的值
for(int i = 1;i<=2*n;i++)
{w[i] = w[i-1]+p[i];//保证所有的点都排完序之后,才开始计算前缀和
}
//容易知道,(每个点做他的圆对称轴,然后从对面的点断开,如果对面是点则这个点最短规定逆时针转过来,这样的话保证有一条边没被经过,我们就可以断开这条边,形成一条链)
//断n次链,相当于每个点都有做断开后序列起点的情况,所以,遍历所有起点,长度为n的序列
ll res = 1e18;//操作数
for(int i = 1;i<=n;i++)
{
int j = i+n-1;//最后的端点
int mid = (i+j)/2;//将这个点放入左边计算,那么左边的长度为mid-i+1;右边为长度为j-mid
ll left = p[mid]*(mid-i+1)-(ll)w[mid]+(ll)w[i-1];//p[mid]大于左边的点
ll right = (ll)w[j]-(ll)w[mid]-p[mid]*(j-mid);
res = min(res,left+right);
// cout<<i<<' '<<j<<' '<<res<<' '<<left<<' '<<right<<endl;
}
//cout<<endl;
cout<<res<<endl;
}
}