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;
}
相关推荐
孬甭_2 小时前
内存函数以及数据在内存中的存储
c语言
卢锡荣2 小时前
单芯双 C 盲插,一线通显电 ——LDR6020P 盲插 Type‑C 显示器方案深度解析
c语言·开发语言·ios·计算机外设·电脑
legendary_1632 小时前
PD显示器方案新维度:Type-C充电,投屏,显示技术革新
c语言·开发语言·计算机外设
码农爱学习3 小时前
用简单的例子,来理解C指针
c语言·开发语言
ACP广源盛139246256733 小时前
长距传输全能芯 @ACP#GSV5800 Type‑C/DP1.4/HDMI2.0 高速延长芯片
c语言·开发语言·网络·人工智能·嵌入式硬件·计算机外设·电脑
cmc10283 小时前
230.C语言循环的相关延时计算
c语言·开发语言
WeeJot嵌入式3 小时前
【中断】初识中断以及外部中断的使用
c语言·stm32·单片机·嵌入式硬件·嵌入式
Rabitebla3 小时前
【C++】手撕日期类——运算符重载完全指南(含易错点+底层逻辑分析)
java·c语言·开发语言·数据结构·c++·算法·链表
CPUOS201012 小时前
嵌入式C语言高级编程之MVC设计模式
c语言·设计模式·mvc