D. Zero Remainder Array

time limit per test

2 seconds

memory limit per test

256 megabytes

You are given an array a consisting of n positive integers.

Initially, you have an integer x=0. During one move, you can do one of the following two operations:

  1. Choose exactly one i from 1 to n and increase ai by x (ai:=ai+x), then increase x by 1 (x:=x+1).
  2. Just increase x by 1 (x:=x+1).

The first operation can be applied no more than once to each i from 1 to n.

Your task is to find the minimum number of moves required to obtain such an array that each its element is divisible by k (the value k is given).

You have to answer t independent test cases.

Input

The first line of the input contains one integer t (1≤t≤2⋅104) --- the number of test cases. Then t test cases follow.

The first line of the test case contains two integers n and k (1≤n≤2⋅105;1≤k≤109) --- the length of a and the required divisior. The second line of the test case contains n integers a1,a2,...,an (1≤ai≤109), where ai is the i-th element of a.

It is guaranteed that the sum of n does not exceed 2⋅105 (∑n≤2⋅105).

Output

For each test case, print the answer --- the minimum number of moves required to obtain such an array that each its element is divisible by k.

Example

Input

Copy

复制代码
5
4 3
1 2 1 3
10 6
8 7 1 8 3 7 5 10 8 9
5 10
20 100 50 20 100500
10 25
24 24 24 24 24 24 24 24 24 24
8 8
1 2 3 4 5 6 7 8

Output

Copy

复制代码
6
18
0
227
8

Note

Consider the first test case of the example:

  1. x=0, a=1,2,1,3. Just increase x;
  2. x=1, a=1,2,1,3. Add x to the second element and increase x;
  3. x=2, a=1,3,1,3. Add x to the third element and increase x;
  4. x=3, a=1,3,3,3. Add x to the fourth element and increase x;
  5. x=4, a=1,3,3,6. Just increase x;
  6. x=5, a=1,3,3,6. Add x to the first element and increase x;
  7. x=6, a=6,3,3,6. We obtained the required array.

Note that you can't add x to the same element more than once.

解题说明:此题是一道数学题,因为每个元素只能被加一次,我们对每个元素%k,然后记录他们出现的次数(不考虑k能整除的情况),因为x是递增的,所以如果我们将取余后的数看成一个数组的话,就相当于x在这个数组上跑循环,直到循环次数等于数组中最大的那个数为止。

cpp 复制代码
#include<iostream>
#include<map>
#include<cmath>
#define ll long long
using namespace std;
int main() 
{
    ll t, n, k, a, ans; 
    cin >> t;
    while (t--) 
    {
        cin >> n >> k; 
        map<ll, ll>mp; 
        ans = -1;
        for (int i = 0; i < n; i++)
        {
            cin >> a;
            if (a % k) 
            { 
                ans = max(ans, (k - a % k) + k * mp[k - a % k]++); 
            }
        }
        cout << ans + 1 << endl;
    }
    return 0;
}
相关推荐
.千余9 小时前
【C++】C++类与对象2:C++构造函数、运算符重载与流输入输出全面解析
c语言·开发语言·前端·c++·经验分享
QiLinkOS10 小时前
【用呼吸重构创造价值关系——QiLink生态】
c语言·数据结构·c++·人工智能·单片机·嵌入式硬件·算法
水无痕simon10 小时前
8 判断,分支,循环语句
c语言
朔北之忘 Clancy11 小时前
2026 年 3 月青少年软编等考 C 语言二级真题解析
c语言·开发语言·c++·学习·青少年编程·题解·考级
万法若空11 小时前
Libevent C语言开发完全教程:从入门到实战
c语言·网络
kkeeper~12 小时前
0基础C语言积跬步之自定义类型结构体
c语言·开发语言
小何code14 小时前
C语言【初阶】第1节,初识C语言
c语言·开发语言
莫陌尛.14 小时前
Fuzzy C-Mean Clustering (FCM)
c语言·开发语言
飞天狗11115 小时前
2025第十六届蓝桥杯c/c++B组国赛题解
c语言·c++·算法·蓝桥杯
mN9B2uk1716 小时前
MySQL命令行导出数据库
c语言·数据库·mysql